多线程2

2017-07-26  本文已影响25人  TYcom

1.同步:多个线程需要对同一数据的存取。两银行账户资金互转,如果两个线程同时取A账户金额100,转50给账户B,A账户只减了50,B账户却加了100;

2.锁对象:synchronized;Lock l=new ReentrantLock();

ReentrantLock()如果传入true,得到一个公平策略锁对象,等待时间越长的线程越容易获得该锁,该锁会大大降低性能。

l.lock()加锁;l.unlock()释放锁;为了防止程序抛出异常,不释放锁从而造成死锁,应该在finally块中释放锁;

3.条件对象:当线程进入临界区,却发现只有某一条件满足之后才能执行,要用条件对象管理那些获得了锁却不能做有用工作的线程。

银行账户转账问题说明:一个线程获得锁对象,进行转账时发现账户余额不足,就不能进行转账,其他线程也不能对该账户进行存钱,因为锁具有排它性,所有需要条件对象。

锁对象调用newCondition()获得条件对象Cindition,条件对象.await()当前对象阻塞并放弃锁;signal()随机解除当前条件对象的等待集中某个线程的阻塞状态,signalAll()解除当前条件对象等待集中所有线程。

await()用法:

while(条件判断){Condition对象.await();  }

解除阻塞并得到锁的线程会从阻塞的地方开始执行。

4.synchronized:每个对象有个内部锁,该锁有个内部条件,内部锁控制要进入synchronized方法的线程,内部条件管理调用了wait()的线程。

多线程2

尽量不使用synchronized与Lock/Condition而使用concurrent包工具。

5.同步阻塞:进入一个同步阻塞获得锁synchronized(obj){。。。}

6.监视器:

上一篇 下一篇

猜你喜欢

热点阅读