synchronized 是隐式锁,出了作用域自动释放;
ReentrantLock只有代码块锁,synchronized 有代码块锁和方法锁;
使用 ReentrantLock锁,JVM 将花费较少的时间来调度线程,线程更好,并且具有更好的扩展性(提供更多的子类);
优先使用顺序:
ReentrantLock> synchronized 同步代码块> synchronized 同步方法
3.使用原子变量实现线程同步为了完成线程同步,我们将使用原子变量(Atomic***开头的)来实现 。
比如典型代表:AtomicInteger类存在于java.util.concurrent.atomic中,该类表示支持原子操作的整数,采用getAndIncrement方法以原子方法将当前的值递加 。
具体示例如下:
【建议收藏 Java线程同步的四种方式详解】private AtomicInteger account = new AtomicInteger(100);public AtomicInteger getAccount() {return account;}public void save(int money) {account.addAndGet(money);}
文章插图
文章插图
4.ThreadLocal实现线程同步如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响,从而实现线程同步 。
具体代码示例如下:
//只改Bank类,其余代码与上同public class Bank{// 创建一个线程本地变量 ThreadLocalprivate static ThreadLocal<Integer> account = new ThreadLocal<Integer>(){@Override//返回当前线程的"初始值"protected Integer initialValue(){return 100;}};public void save(int money){//设置线程副本中的值account.set(account.get()+money);}public int getAccount(){//返回线程副本中的值return account.get();}}
文章插图
文章插图
以上
作者简介陈睿|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,专注于互联网架构技术 。
阅读mikechen的互联网架构更多技术文章合集
Java并发|JVM|MySQL|Spring|Redis|分布式|高并发?
经验总结扩展阅读
- 晕车药什么时候吃最好 晕车药物的建议
- 酒店烧水壶能不能用
- 真的不建议大学选报心理学专业吗
- Java导出带格式的Excel数据到Word表格
- 如何通过 Java 代码隐藏 Word 文档中的指定段落
- day44-反射03
- Javascript 手写 LRU 算法
- Java 读写锁 ReadWriteLock 原理与应用场景详解
- 为什么阿里Java开发手册不推荐使用Timestamp
- 大华海康NVR录像JAVA下载及WEB播放