java对象发布和AQS周边
java对象的发布与逃逸(参考这篇)
发布 发布的意思是使一个对象能够被当前范围之外的代码所使用
逃逸 一种错误的发布,当一个对象还没有构造完成时,就使它被其他线程所见,可能会读到未初始化的值
对象如何安全发布
- 在静态初始化函数中初始化一个对象引用
- 将对象的引用保存到volatile类型域或者AtomicReference
- 将对象的引用保存到某个正确构造对象的final类型域中,初始化安全
- 将对象的引用保存到一个由锁保护的域中,读写上锁
1,2,4点就是单例模式的实现,而final是通过不变来保证对象的发布安全
JUC的核心是AQS(同步队列 AQS,全称 AbstractQueuedSynchronizer)
其他有
- 三大同步器
1.CountDownLatch
2. CyclicBarrier
3. Semaphore
CountDownLatch和CyclicBarrier区别:
1.countDownLatch是一个计数器,线程完成一个记录一个,计数器递减,只能只用一次
2.CyclicBarrier的计数器更像一个阀门,需要所有线程都到达,然后继续执行,计数器递增,提供reset功能,可以多次使用
- 一个条件辅助Condition