java 同步相关笔记(一)

记录同步的一些知识点。

1.同步方法和同步代码块是什么?

使用synchronized关键字,代码块细致程度上的区别!实际上推荐最好优先使用BlockQueue,Excutor,同步集合等,然后再是synchronized关键字,最才是Lock/Condition。

2.监视器是什么?

内置与每一个Object对象中,确保同一时间只能有一个线程可以访问特定的数据和代码。
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

3.Lock对比synchronized

Lock的操作与synchronized相比,灵活性更高,而且Lock提供多种方式获取锁,有Lock、ReadWriteLock接口,以及实现这两个接口的ReentrantLock类、ReentrantReadWriteLock类。有高手总结的差异如下:

  1. Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
  2. synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
  3. Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
  4. 通过Lock可以知道有没有成功获取锁,而synchronized却无法办到;
  5. Lock可以提高多个线程进行读操作的效率。

在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

4.如何指定获取锁的顺序?

原因:避免出现死锁,如银行转账时需要锁定账户,可能出现死锁(都等待获取另一个账户的锁)。
方法:

==================================
==疑问?帮助?批评?欢迎评论 | QQ:593159978==
==================================

猜你喜欢

转载自blog.csdn.net/chenjhit/article/details/80028768