由于对Happens before between threads and atomic variable的回答是断言不成立,因此我需要一个替代实现。线程1和线程2分别更新整数t1和t2。一旦更新,则不会对t1或t2进行其他任何更新。分配给t1和t2的值来自一个公共计数器,该计数器在每次分配后都会递增。我需要确保以下断言是正确的;
int cnt=0;
ReentrantLock lock = new ReentrantLock();
volatile Integer t1=null;
volatile Integer t2=null;
//Thread1
lock.lock();
try{t1=cnt++;}finally{lock.unlock();}
if(t2 == null){
assert t2==null || t2>t1;
}
//Thread2
lock.lock();
try{t2=cnt++;}finally{lock.unlock();}
if(t1==null){
assert t1==null || t1>t2;
}
问题是断言是否成立?如图所示,t1和t2上是否需要挥发物?有没有更好/正确的方法来实现这一目标?
答案 0 :(得分:1)
t
变量。因此,如果线程位于if(t1==null){}
中,则t2
将是null
或大于t1。另一个线程也是如此。volatile
,因为t1
和t2
在不同线程之间共享,并且您需要确保在不同线程中该字段的读取和写入之间存在HB 。if(t1==null){...}
的正确解决方案都必须满足要求:t1=cnt++
必须仅由一个线程同时执行。答案 1 :(得分:-1)
如果(t1 == null)在到达相应的assert语句之前执行,则线程1在执行线程2之后有可能将线程1写入t1。
if语句并在其后声明应在同步上下文中执行。