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中的线程同步和互斥机制可以防止多个线程同时访问共享资源导致...
来源:新民晚报记者杜雨敖摄【新民晚报·新民网】国新办今天上午举...
图为中国人民银行总行大楼。(新华社发)中国人民银行4月3日发布的...
1、某法可收沙的呀对手,带搓温暖文运拽背吼种其罗嗦其中关句,八冻珍...
昨日,记者从市邮政管理局获悉,我市出台《快递员和外卖骑手权益保...
日前,在盐池县高沙窝镇长流墩村卫生室诊间视频会诊室,村医王新利...
本文转自:南方日报省运会空手道比赛在连州收官二百二十八名运动员...
2020年,不要在一件别扭的事上纠缠太久。纠缠久了,你会烦,会痛,...
一、大同最新疫情消息-数据概览:1、新增本土:0;2、新增无症状:0...
1、主料:娃娃菜1个、粉丝适量辅料:油盐适量、生抽适量、蒜辣椒适...
阿胶,性味甘,平。入肺、肝、肾经。具有补血,止血,养阴,安胎的...
SW的意思是太阳之井高地。SW是暴雪旗下游戏《魔兽世界》资料片《决...
工会干事1名任职要求:(1)热爱党的工运事业,工作态度积极,责任心...
先来说说金星,她过去的经历只能用传奇来形容,在娱乐圈也算是独一...
广河:加速推进棚户区改造项目建设
中国注册会计师协会微信公众号4月3日消息,近日,为持续贯彻落实国...
直播吧4月3日讯知名乒乓球选手张继科近日陷入场外风波。张继科在此...
1、公交线路:K513路→503 K503路。2、全程约29 0公里从瓶窑乘坐K...
禹天建绘我与杨叔子院士过从不密,多为神交,但有一次交集,却是终...
高争民爆00282704月03日在投资者关系平台上答复了投资者关心的问题...
1、这类型的动漫有很多,无论是在国内,还是在日本。2、中国:钢铁...
云南2023年注册会计师考试报名费用是多少?注会考试报名费贵吗?各...
1 市民一定要通过官方渠道预约疫苗,接种疫苗要到正规医院或是社区...
银河证券每日晨报
渔业大县上演一二三产融合新故事“两条鱼”游出百亿产业链2022年,...
济南至淄博烧烤游周末往返专线列车于3月31日开行每周五、周六、周日...
1、毕彦君,1955年7月出生于辽宁省鞍山市,中国内地男演员、国家一...
4月2日是“世界自闭症关注日”。自闭症,也叫孤独症,患者常常表现...
(牛朝阁)“今天过后(3月31日),政府补贴和厂家优惠都没有了,按正常...
四月,你都制定了哪些学习计划?无论升学求职还是学习考证,都要提...