synchronized互斥锁。锁定的是对象。非公平锁
用在一个static静态方法上,锁定的是类的class, 类中有加锁和不加锁方法,同
synchronized对象加锁是从堆里直接给对象加锁
重入锁,类里面一个加锁方法可以调用另一个加锁方法,子类里面也可以调用父类的加锁方法
程序里出异常,锁会被释放,不想释放就加try/catch.
不能用字符串常量作为锁的对象
wait通常(99%)情况下与while一起使用。
CountDownLatch:门闩,
new CountDownLatch(num);//num数量
latch.await();//等待
latch.countDown();//数量减一
减到0后,自动打开
ReentrantLock:
用于替代synchronized,但还是有区别的,lock可以尝试获取锁tryLock(),synchronized遇异常会释放锁,而它不会。
使用ReentrantLock还可以用lockInterruptibly方法,可以对线程interrupt方法做出响应,在一个线程等待锁的过程中,可以被打断。使用场景如第二个线程要等待第一个线程释放锁才能继续,那么第二个就可以用lockInterruptibly()来中断不待。
Lock lock = new ReentrantLock();//手工锁 ReentrantLock(true);为公平锁 lock.lock();//锁定 lock.unlock();//释放锁(一般在finally里释放)
lock/condition:比wait/notifyall要更精细
Lock lock = new ReentrantLock(); Condition a = new lock.newCondition(); Condition b = new lock.newCondition(); a.await();a等待 b.signalAll();通知b
ThreadLocal: