Skip to content

Commit a14c7ab

Browse files
authored
Merge pull request frank-lam#46 from wuyc/master
Update 03-Java并发编程.md
2 parents 6d8b051 + ed8f05f commit a14c7ab

File tree

1 file changed

+1
-1
lines changed

1 file changed

+1
-1
lines changed

notes/JavaArchitecture/03-Java并发编程.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,7 @@ ReentrantLock 多了一些高级功能。
770770
- (用法)synchronized(隐式锁):在需要同步的对象中加入此控制,synchronized 可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。
771771
- (用法)lock(显示锁):需要显示指定起始位置和终止位置。一般使用 ReentrantLock 类做为锁,多个线程中必须要使用一个 ReentrantLock 类做为对象才能保证锁的生效。且在加锁和解锁处需要通过 lock() 和 unlock() 显示指出。所以一般会在 finally 块中写 unlock() 以防死锁。
772772
- (性能)synchronized 是托管给 JVM 执行的,而 lock 是 Java 写的控制锁的代码。在 Java1.5 中,synchronize 是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用 Java 提供的 Lock 对象,性能更高一些。但是到了 Java1.6 ,发生了变化。synchronize 在语义上很清晰,可以进行很多优化,有<u>适应自旋,锁消除,锁粗化,轻量级锁,偏向锁</u>等等。导致 在 Java1.6 上 synchronize 的性能并不比 Lock 差。
773-
- (机制)**synchronized 原始采用的是 CPU 悲观锁机制,即线程获得的是独占锁**。独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。**Lock 用的是乐观锁方式**所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是 CAS 操作(Compare and Swap)。
773+
- (机制)**synchronized 原始采用的是 CPU 悲观锁机制,即线程获得的是独占锁Lock 也属于悲观锁**独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。相对而言乐观锁每次不加锁,而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是 CAS 操作(Compare and Swap)。
774774

775775

776776

0 commit comments

Comments
 (0)