Java常用的线程同步的方式主要有
synchronized关键字,可以修饰代码块或者方法,确保同一时间只有一个线程能访问。
synchronized发生异常时,会自动释放线程占用的锁,故不会发生死锁现象。
ReentrantLock 与 synchronized类似,也可以确保同一时间只有一个线程能访问。
且具有更灵活的锁定机制,可以中断等待锁的线程,Lock发生异常,若没有主动释放,
极有可能造成死锁,故需要在finally中调用unLock方法释放锁;
Semaphore 信号量,控制同时访问某个资源的线程数量,可以用于限流或实现资源池
CountDownLatch 倒计时器,允许一个或多个线程等待其它线程执行完毕后在执行,可用于线程之间的协调与通信
CyclicBarrier 循环屏障,让一组线程在一个栅栏处等待,直到所有线程都到达某个屏障点,才会继续执行