,计数器的值就会减1
当计数器值到达0时,它表示所有的线程已经完成了任务,然后在 闭锁上等待的线程就可以恢复执行任务
线程必须在启动其他线程后立即调用 CountDownLatch.await() 方法...i副本压入操作数栈
对i进行+1 操作,
弹出操作数栈,写入主存
比如线程A 读取i 的值10, 正准备向cpu发送指令 +1时被阻塞了, 线程A由于还没修改, 不会导致线程B的工作内存中缓存变量...之前已经把操作数放入了自己的操作数栈中 线程A才中断的 CPU由于保存了上次线程A的工作状态
因此, 轮到线程A工作时, 会继续上次的操作, 即: 开始对操作数栈中的数进行+1操作, 然后立即刷回主存...,
volatile其实适合一写多读, 如果多个线程都写, 那么就需要CAS去更新
由于我们测试代码是阻塞一个main线程, 其实CountDownLatch能同时阻塞多个线程, 所以才用到队列
然后...await()方法死循环里检测到条件满足了, 就退出死循环,退出阻塞, 接着往下执行了
之前我们了解到, 当不满足tryAcquireShared(),条件时,
await()方法就一直 死循环阻塞