synchronized、volatile、ReentrantLock的区别是什么

发布时间:2023-04-20 16:00:35 作者:iii
来源:亿速云 阅读:99

这篇文章主要讲解了“synchronized、volatile、ReentrantLock的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“synchronized、volatile、ReentrantLock的区别是什么”吧!

并发编程特性

  1. 原子性:对共享资源的一组操作,要么成功要么失败,不会出现部分成功部分失败的情况。

  2. 可见性: 当线程获取到琐时,会拷贝一份共享资源到本地内存,释放锁时会将共享资源刷新到主内存中。可见性是指当共享资源发生变化时,其他线程都能够看到这个变化。

  3. 有序性:为了提高效率,编译器和处理器会对代码进行指令重排,单线程的情况下,指令重拍不会受到影响,多线程情况下可能会影响代码执行的正确性。有序性是指代码编写顺序和执行顺序是一致的。

volatile

volatile 是JVM提供的最轻量级的同步机制,编译器不会对其进行优化。

特性:

作用的地方:

volatile 只能用来修饰成员变量。

public class VolatileTest {
    
    private volatile static String staticVolatile;
    
    private volatile String memberVolatile;
}

synchronized

synchronized关键字是java提供的内置锁来保证我们对共享资源的同步,它会自动加锁和释放锁,它的锁是非公平锁, synchronized关键字标记的地方会被编译器进行优化。synchronized会使线程串行执行,可能会造成线程阻塞。

特性

作用的地方

synchronized关键字可用来修饰方法或者代码块。

修饰方法,分为实例方法和静态方法

public  synchronized void objectMethods(){
   .....
}
public static  synchronized void staticMethods(){
   .....
 }

修饰代码块

obj为对象的引用 对象锁

public  void objectMethods(){
	synchronized (obj){
	}
}

Object 为某个类 类锁

public  void classLock(){
	synchronized (Object.class){
	}
}

ReentrantLock

Lock 是 Java 5提供的一个具有锁机制的接口,ReentrantLockLock的一个实现,内部是通过AQS(AbstractQueuedSynchronizer)实现的。ReentrantLock翻译过来是可重入锁,它和synchronized类似,ReentrantLock 需要手动加锁和释放锁, 相对于synchronized它更加灵活,提供了更多的方法。 ReentrantLock 有公平锁和非公平锁两种方式,默认是使用公平锁。

特性

ReentrantLock 是可重入的同步锁,所以它除了具有并发编程的三大特性,还具有可重入性。

作用的地方

ReentrantLock 是一个类,它既可以作为成员变量,也可以作为局部变量使用。做为成员变量和局部变量时,使用的方式有一点点不同,不管使用哪种方式,最后都别忘了要调用unlock() 方法手动释放锁。

做为成员变量使用格式:

private Lock globalLock = new ReentrantLock();

public void globalLock(){
    if (globalLock.tryLock()) {
        try {
        } catch (Exception e) {
          
        }finally {
            globalLock.unlock();
        }
    }
}

上面的tryLock() 方法是尝试获取锁,如果获取成功返回true,否则返回false,也可以换成加了等待时间的 boolean tryLock(long time, TimeUnit unit) 方法,在设定的等待时间内获取锁成功则返回true,否则false。

做为局部变量使用格式:

public void lock(){
     Lock lock = new ReentrantLock();
     lock.lock();
     try {

     }finally {
         lock.unlock();
     }
 }

对比

简单对比一下三者之间的区别:


volatilesynchronizedReentrantLock
是否是关键字
是否需要手动加锁/释放锁
是否能保证并发安全
是否是公平锁\有公平锁和非公平锁两种实现
是否会阻塞线程
JVM是否会对其优化
特性可见性、有序性可见性、有序性、原子性可见性、有序性、原子性
使用的地方成员变量方法、代码块成员变量、局部变量

感谢各位的阅读,以上就是“synchronized、volatile、ReentrantLock的区别是什么”的内容了,经过本文的学习后,相信大家对synchronized、volatile、ReentrantLock的区别是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

推荐阅读:
  1. 静默安装Oracle及创建数据库11G R2
  2. DBM_SQLTUNE使用简介

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

reentrantlock synchronized volatile

上一篇:Flutter加载图片流程之ImageProvider源码分析

下一篇:Python怎么获取与处理文件路径/目录路径

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》