Java 中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致数据不一致的问题。Java 中的线程同步和互斥机制有多种实现方式,包括 synchronized 关键字、Lock 接口、Semaphore 类、Condition 接口等。
synchronized 关键字可以保证同步访问共享资源,其用法有两种:
修饰实例方法在方法前加上 synchronized 关键字,保证同一时刻只有一个线程能够执行该方法。
(相关资料图)
public synchronized void method() { // 同步代码块}
修饰代码块在代码块前加上 synchronized 关键字,保证同一时刻只有一个线程能够执行该代码块。
public void method() { synchronized (this) { // 同步代码块 }}
Lock 接口提供了比 synchronized 更为灵活的锁机制。Lock 接口有多个实现类,其中最常用的是 ReentrantLock 类。ReentrantLock 类实现了 Lock 接口,使用方式如下:
import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyRunnable implements Runnable { private Lock lock = new ReentrantLock(); // 创建可重入锁 @Override public void run() { lock.lock(); // 获取锁 try { // 同步代码块 } finally { lock.unlock(); // 释放锁 } }}
在该例子中,我们使用 ReentrantLock 类创建了一个可重入锁,并在 run() 方法中使用了 lock() 方法获取锁,使用了 unlock() 方法释放锁。
Semaphore 类可以控制并发线程的数量,其用法如下:
import java.util.concurrent.Semaphore;public class MyRunnable implements Runnable { private Semaphore semaphore = new Semaphore(2); // 创建 Semaphore 对象,限制线程数量为 2 @Override public void run() { try { semaphore.acquire(); // 获取许可证 // 同步代码块 } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); // 释放许可证 } }}
在该例子中,我们创建了一个 Semaphore 对象,限制线程数量为 2,然后在 run() 方法中使用了 acquire() 方法获取许可证,使用了 release() 方法释放许可证。
Condition 接口可以实现线程之间的通信,其用法如下:
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyRunnable implements Runnable { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); // 创建条件变量 @Override public void run() { lock.lock(); try { while (true) { condition.await(); // 等待信号 // 处理信号 } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void signal() { lock.lock(); try { condition.signal(); // 发送信号 } finally { lock.unlock(); } }}
在该例子中,我们使用 Lock 和 Condition 接口实现了线程之间的通信。在 run() 方法中,我们使用了 await() 方法等待信号,使用了 signal() 方法发送信号。
线程池是一种重用线程的机制,可以避免线程的频繁创建和销毁,提高了线程的利用率。Java 中的线程池是通过 Executor 框架实现的,包括 Executor、ExecutorService 和 ThreadPoolExecutor 三个类。
Executor 是一个接口,只定义了一个 execute(Runnable command) 方法,用于执行 Runnable 对象。
import java.util.concurrent.Executor;public class MyRunnable implements Runnable { @Override public void run() { // 线程执行的代码 }}public class Test { public static void main(String[] args) { Executor executor = Executors.newSingleThreadExecutor(); // 创建 Executor 对象 executor.execute(new MyRunnable()); // 执行线程 }}
在该例子中,我们使用 Executors 工厂类创建了一个单线程的 Executor 对象,然后使用 execute() 方法执行了一个 MyRunnable 对象。
ExecutorService 接口继承自 Executor 接口,提供了更多的方法,如提交任务、关闭线程池等。
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class MyRunnable implements Runnable { @Override public void run() { // 线程执行的代码 }}public class Test { public static void main(String[] args) { ExecutorService executorService = Executors.newFixedThreadPool(2); // 创建 ExecutorService 对象 executorService.execute(new MyRunnable()); // 执行线程 executorService.shutdown(); // 关闭线程池 }}
在该例子中,我们使用 Executors 工厂类创建了一个固定大小为 2 的线程池,然后使用 execute() 方法执行了一个 MyRunnable 对象,最后使用 shutdown() 方法关闭了线程池。
ThreadPoolExecutor 类是 ExecutorService 接口的默认实现,提供了更为灵活的线程池管理。
import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class MyRunnable implements Runnable { @Override public void run() { // 线程执行的代码 }}public class Test { public static void main(String[] args) { ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS, new LinkedBlockingQueue()); // 创建 ThreadPoolExecutor 对象 threadPoolExecutor.execute(new MyRunnable()); // 执行线程 threadPoolExecutor.shutdown(); // 关闭线程池 }}
在该例子中,我们使用 ThreadPoolExecutor 类创建了一个大小为 2-4 的线程池,使用 execute() 方法执行了一个 MyRunnable 对象,最后使用 shutdown() 方法关闭了线程池。
关键词:
java线程的创建和管理(二)_焦点快看
昆明盘龙区教育体育系统 全面开展“家庭教育”主题系列活动 焦点速看
宝马轿车m系_宝马的m系车是什么 新视野
退休教师在医院做保洁:找不到其他活 3000每月被护士呵斥-环球速看
和讯个股快报:2023年04月03日 东岳硅材(300821),该股K线呈现“红三兵”形态 全球信息
博主探店变“探钱”,消费者避雷变“踩雷”
青海森林蓄积量增加到4993万立方米 森林覆盖率较10年前增长2.27%
脊梁网上哪里看_脊梁网 天天快看点
宁马城际铁路(马鞍山段)首个挂篮法施工连续梁顺利合龙 每日动态
中国在高价购买俄罗斯原油吗? 热资讯
岭南股份:公司有机会与腾讯开展战略合作-视讯
焦点快播:16日,省海军航空实验班将在洛阳初选
伪造、买卖电动自行车行驶证 三人分别领刑
电脑猫和老鼠咋下载_猫和老鼠官方手游电脑版怎么下载 全球观点
3天超5500万元!“村BA”带火贵州台江特色旅游_每日热点
存贷双双大跌!美国银行业危机后遗症显现 当前热门
美媒:特朗普下周提审时不会被戴手铐或拍大头照,但会提取其指纹 头条焦点
想念张国荣:永远记得他,是我们的幸运-环球快看
郑州向市民发出倡议
天天要闻:美发店管理制度范本_美发店管理制度
任务栏不显示应用图标怎么办_任务栏
一尺九等于多少厘米长_一尺九_天天滚动
热门看点:纸盒房子造型图片_纸盒房子造型图片
奋达科技: 第五届董事会第三次会议决议公告_关注
【世界新要闻】夏秋新航季,湖南这些航线有调整
网易云音乐与中国移动视频彩铃达成合作,共探音乐社交新模式
观速讯丨年内首发市盈率最高个股登录科创板
23年acca报名费用多少钱一科?看完这篇你就知道了
自己泡药酒,安全吗?提醒:这3类中药或带有毒性,尽量别泡酒|全球快报
【环球速看料】网络布局再添新成员 沃尔沃卡车江西铭洋恢弘起航