Fulvaz PlayGroud

<七周七并发模型>笔记

chp2

共享变量解决冲突

加锁

多个共享资源
加多个锁,但加多个锁必然可能导致死锁

死锁
保证上锁顺序

外星方法
即调用者不知道其实现的方法

问题:如果调用者已经加锁,再调用外星方法,这个方法如果有锁,就很有可能死锁,解决方法是调用方法前对调用者进行一次保护性复制(对象),然后在进行调用

解决死锁

使用ReentrantLock
锁有超时事件,超时会放弃所拥有的锁

但是这样并不能完全解决死锁问题,这种方案会产生活锁现象,当所有死锁同时超时,那么下次再获得锁时,很有可能会继续死锁

通过设置不同的超时事件可以减少活锁的概念

###交替锁

###条件锁

###原子变量
atomic包

###自学内容

###公平锁与非公平锁
公平锁: 线程按照先来后到的方式获取锁
非公平: 线程竞争,没获取到锁的线程会被压进队列,但是,压进队列的线程依旧会被后到的线程抢到锁

公平锁和非公平锁的区别是性能,非公平锁的性能回事公平锁的5~10倍
(数据来源: http://www.majin163.com/2014/03/17/synchronized2/)

###虚假唤醒(spurious wakeup)
就算没人调用signal,await还是有可能会被调用

所以用while等待条件满足唤醒,就算被虚假唤醒了,因为要判断一次条件,所以也能避免虚假唤醒造成的问题

###为什么synchronize比reentrantlock慢
因为syn是悲观锁,reentrantlock是乐观锁

独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低
http://blog.csdn.net/natian306/article/details/18504111

最佳方案

使用线程池

实际使用中极少会直接创建线程

线程池大小?