synchronized

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:

...
原文地址:https://www.cnblogs.com/javage/p/9503624.html