建议收藏 Java线程同步的四种方式详解( 二 )


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);}

建议收藏 Java线程同步的四种方式详解

文章插图
建议收藏 Java线程同步的四种方式详解

文章插图
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();}} 
建议收藏 Java线程同步的四种方式详解

文章插图
建议收藏 Java线程同步的四种方式详解

文章插图
以上
作者简介陈睿|mikechen,10年+大厂架构经验,《BAT架构技术500期》系列文章作者,专注于互联网架构技术 。
阅读mikechen的互联网架构更多技术文章合集
Java并发|JVM|MySQL|Spring|Redis|分布式|高并发?

经验总结扩展阅读