欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

synchronized 与 ReentrantLock

发布时间:2024/1/17 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 synchronized 与 ReentrantLock 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

2019独角兽企业重金招聘Python工程师标准>>>

synchronized 作用于非静态方法

public class Sync implements Runnable{private static int count;public Sync() {count = 0;}public synchronized void add() {for (int i = 0; i < 5; i++) {try {System.out.println(Thread.currentThread().getName() + " --- " + (++count));Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}}}@Overridepublic void run() {add();} }

test1  :

public void test() {Sync sync1 = new Sync();Sync sync2 = new Sync();Thread t1 = new Thread(sync1);t1.start();Thread t2 = new Thread(sync2);t2.start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}

由于两个线程传入了两个不同的 Sync 对象,相当于两把锁。运行结果是两个线程互相切换的;如果传入的是同一个对象,线程之间不会乱序,因为是同一把锁,会互斥等待。

以下两种写法等价: public synchronized void method( ) {//todo}public void method( ) {synchronized (this){ //todo} }以下两种写法也是等价的: public static synchronized void method( ) {//todo}public void method( ) {synchronized (xxx.class){ //todo} }

如果 Sync 类的 add 方法上面加 static 关键字,同样运行test1 的代码结果不会乱序。因为这时 Sync 类的所有对象共享一把锁。
总结:

无论synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;

如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。

如果加的是对象锁,每个对象只有一个锁(lock)与之相关联,谁拿到这个锁谁就可以运行它所控制的那段代码

        除了使用 synchronized 之外, 我们还可以使用 ReentrantLock 来实现同步。 ReentrantLock 与 synchronized 相似,都具备线程重入特性,只是写法上有点区别。ReentrantLock 需要显示的声明出来,并配合(lock( ), unlock( ), try/finally 语句块来完成)。ReentrantLock 增加了一些高级功能:

  • 等待可以中断:当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待,改为处理其他逻辑;
  • 公平锁: 多线程在等待一个锁的时候,可以实现按照申请锁的顺序依次获取锁;
  • 锁可绑定多个条件: 在 synchronized 中,锁对象的 wait(), notify(), notifyAll() 方法可以实现一个隐含的条件,如果要实现多条件关联,就必须额外加锁。而 ReentrantLock 只需要调用 newCondition() 方法即可;
  • 转载于:https://my.oschina.net/freedemon/blog/1810155

    总结

    以上是生活随笔为你收集整理的synchronized 与 ReentrantLock的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。