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中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致数据不一致的问题。Java中的线程同步...
”王晓琳介绍,化肥生产企业创新生产缓释肥等易吸收、不易流失的新品种,农技人员引导农民测土配方施肥...
信用卡逾期一般是因为什么?忘记时间:现在的人每天要处理的事情有很
1、交通概况2、主要展示店铺的基本信息,包括流量概况,最近七天的北宝,最近七天的客源,最近七天的一...
青建国际:2022年总收益83亿港元亏损净额为5 88亿港元3月31日,青建国际控股有限公司披露2022年年度业...
三秦都市报-三秦网讯(王维记者陈奋翔)3月27日23时许,咸阳市武功县公安局大庄派出所接辖区一位热心群...
星标才能经常看到我们哦~后台回复「加群」加入现代广告圈幼狮初审在即,大家是否已经准备好了呢?每一年...
每经AI快讯,有投资者在投资者互动平台提问:请问贵司怎么时候披露一季报?*ST皇台(000995 SZ)4月1日在...
3月31日,景顺长城优选混合最新单位净值为3 7731元,累计净值为6 4397元,较前一交易日上涨0 74%。历...
日本在OLED显示领域过去颇有建树,2015年强强联合的JOLED,真可谓是衔着金汤匙出生,曾几何时,为什么落...
北京朝阳:今年老旧小区改造全面开工,粉刷,住建委,六里屯,上下水,北京市,朝阳市,老旧小区改
3月31日北向资金减持66 81万股中原环保。近5个交易日中,获北向资金减持的有5天,累计净减持122 47万...
三国志战棋版战法破胆怒喝是什么样呢,有很多玩家还没见过。该战法是武将周仓的自带战法,是一个主动战...
1、1 平均年限法 平均年限法又称为直线法,是将固定资产的折旧均衡地分摊到各期的一种方法。2、采用...
3月31日上午,港股餐饮板块走强。截止发稿,奈雪的茶涨14%,颐海国际涨10%,呷哺呷哺涨4%,海底捞涨4%。...
卢卡申科:将在必要条件下与普京就俄在白境内部署战略核武器达成一致
上证报中国证券网讯(记者韩宋辉)3月31日,在邮储银行2022年业绩发布会上,邮储银行行长刘建军表示,金融...
2023年“清明”假期即将来临,假期为4月5日一天。为确保“清明”假期道路交通安全、畅通、有序,宝鸡交...
黑龙江2023注会报名时间及入口由注册会计师考试栏目提供,查找更多考试报名资讯、准考证打印、成绩查询或...
冲上云霄!TVB第二场淘宝直播成交7320万元,是首场3倍多,直播,淘宝,tvb,马国明,陈自瑶,冲上云霄,社交平台
资讯News
06-20
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
11-03
聚焦Policy
当好农民工的“护薪人” 近日,罗某等7名农民工在收到被拖欠的工资后,纷纷打电话向江西省南昌市...
“通讯录里所有人都知道我欠钱了” □ 本报记者 韩丹东 □ 本报见习记者 张守坤 ...
大连宝马车撞人案肇事司机被判死刑 本报讯 记者韩宇 10月29日,辽宁省大连市中级人民法院一审...
医院财务迷上网络赌博输光5000万元公款 □ 本报记者 马维博 □ 本报通讯员 汪宇堂 曹...
辊环车削 雕琢毫厘(工匠绝活) 【绝活看点】 23年来,雷虎始终扎根一线,改进钢材轧制工艺...
交警严查超标电动自行车挪用“白牌” 截至昨晚6时,处罚电动自行车违法行为共计6585笔;下一步将...
明起寒潮来袭 北方气温普降10℃以上 中央气象台预计,本周日北京平原地区最低气温降至-4℃左右...
多种蔬菜价格降幅达五成 包括菠菜、蒿子秆等 预计本月中旬蔬菜恢复供需平衡 本报讯(记者...
北京周日最低气温或达-4℃ 本报讯(记者 赵婷婷)北京青年报记者昨天从中央气象台获悉,新一股...
昌平一家四口确诊新冠肺炎 天通北苑第二社区升级为中风险地区 朝阳两涉疫校区及16所学校停课 ...