Java中的锁

2019-01-23  本文已影响0人  CoderZzbJohn
image.png

1.是否需要锁住资源
1.1需要锁住,悲观锁。CAS
1.2不需要锁住,乐观锁。

2.获取锁失败时,线程是否需要阻塞。
2.1阻塞。
2.2自旋。
1.自旋锁。
2.适应性自旋锁。

3.竞争同步资源时的流程状态。
3.1无锁。CAS。不锁住资源,多线程中只有一个线程能成功修改资源,其他线程重试等待。
3.2偏向锁。
3.3轻量级锁。自旋等待CAS。
3.4重量级锁。阻塞等待。

4.竞争锁时是否需要排队。
4.1公平锁。 公平锁时维护了线程排队的队列。先到的先排队,优先获得锁资源。
4.2非公平锁。某个线程刚过来,首先尝试能否直接获得锁,如果获得锁了则不需要阻塞等待,而是直接执行。如果没有获取到锁,则进入队列排队,只有队列中的第一个线程有机会获取到锁。

线程在获得锁的过程中,需要等待唤醒。这需要cpu唤醒阻塞线程消耗时间。直接获取了锁,则减少了需要被唤醒的线程数,节省了系统资源。缺点是可能会造成其他线程长时间等待。

5.多线程是否可以共享一把锁。
5.1共享锁。
5.2排他锁。

上一篇下一篇

猜你喜欢

热点阅读