ITPub博客

首页 > 应用开发 > > synchronized和ReentrantLock有什么区别?

synchronized和ReentrantLock有什么区别?

作者:wyvernw 时间:2019-10-10 11:50:24 0 删除 编辑

synchronized

synchronized 是Java 内建的同步,提供了互斥的语义和可见性,当一个线程已经获取当前锁时,其他试图获取的线程只能等待或者阻塞在那里。

synchronized 可以用来修饰方法,也可以使用在特定的代码块上,本质上synchronized 方法等同于把方法全部语句有 synchronized 块包起来。

ReentrantLock

ReentrantLock,可重入锁,它的语义和synchronized 基本相同。

重入锁通过代码直接调用lock() 方法获取,代码书写也更加灵活;

同时,ReentrantLock 提供了很多实用的方法,能够实现很多synchronized 无法做到的细节控制,比如可以控制 fairness(公平性)。

代码中需要注意,必须明确调用 unlock() 方法释放,否则就会一直持有该锁。

在高竞争情况下,ReentrantLock 仍然有一定性能优势。

重入锁可以设置公平性(fairness),我们可在创建重入锁时选择是否是公平的。

ReentrantLock fairLock = new ReentrantLock(true);

若要保证公平性,则会引入额外开销,自然会导致一定的吞吐量下降。所以,建议只有在应用确实有公平性需要的时候,才有必要指定它。

ReentrantLock fairLock = new ReentrantLock(true);// 这里是演示创建公平锁,一般情况不需要。

fairLock.lock();

try {

// do something

} finally {

fairLock.unlock();

}

线程安全

是多线程环境下,正确性的概念;也就是保证多线程环境下,共享的、可修改的状态的正确性,这里的状态反映在程序中其实可以看作是数据。

线程安全需要保证几个基本特性:

原子性 -- 相关操作不会中途被其他线程干扰,一般通过同步机制实现;

可见性 -- 是一个线程修改了某个共享变量,其状态能够立即被其他线程知晓,通常解释为将线程本地状态反映到主内存上,volatile 就是负责保证可见性的;

有序性 -- 是保证线程内串行语义,避免指令重排等。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/835/viewspace-3166071/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-04-12

  • 博文量
    128
  • 访问量
    1298