Java并发编程实践笔记(三)——chapter1(synchronized锁)

1.锁

synchronized

内部锁(intrinsic locks),又称监视器锁(Monitor locks)。

互斥锁

synchronized块就是一种互斥锁(mutual Exclusive locks,缩写mutex)。至多只有一个线程可以拥有锁。
由同一个锁保护的synchronize块内的逻辑就是一个完整的原子操作—— 一组语句,作为单独的不可分割的单元运行

重入锁

锁被一个线程请求占用的时候,JVM会记录锁的占有者,如果同一个线程再次请求这把锁,也可以进入。
场景:
如果子类覆写了父类的synchronized方法,并调用父类中的方法,如果没有可重入性的话,就会造成死锁(父方法的调用在等着执行子方法的线程释放锁,这同一把锁又要等父方法执行完继而子方法执行完才能释放)。

使用其他组件引入的问题

有些场景下,由于我们对类的封装不够好,所以会引入一些问题。
比如我们使用TimerTask去管理一小段逻辑,这个逻辑中会操作一个状态。这样Timer的管理线程就会去操作这个状态。
这样如果我们自己的程序主线程中也操作这个状态了,就会引起并发问题。

2.锁的粒度

1.粒度与效率

锁粒度的大小是一个矛盾的命题。
通常意义上,锁的粒度越小越好,因为锁的粒度太大会降低并发。
因为锁的请求与释放是需要开销的,所以如果锁的粒度太细,性能不一定会提高。
比如:
public void invoke1() {
    synchronized(this) {...}
    ...
    synchronized(this) {...}
    ...
    synchronized(this) {...}
    ...
}
不一定比下面的代码效率高
public void invoke1() {
    ...
    synchronized(this) {...}
    ...
}
不要过早的为了性能而牺牲了简单性”。

2.锁中忌讳的操作

IO,rpc和一些耗时的计算尽量不要放到锁中,因为长时间占有锁会导致活跃度与性能的风险。

猜你喜欢

转载自blog.csdn.net/xxcupid/article/details/52910783