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()的线程。
尽量不使用synchronized与Lock/Condition而使用concurrent包工具。
5.同步阻塞:进入一个同步阻塞获得锁synchronized(obj){。。。}
6.监视器: