这个问题似乎很明显,但无论如何我都不清楚。
我有以下课程:
public class MyClass{
private Object lock = new Object();
private boolean flag;
public void method(){
//Start synchronization block
if(!flag){
flag = true;
//end synchronization block
//do some bulk operation, should be synchronized
}
//some other staff
}
}
问题是我不能把我需要同步的代码片段,因为它不正确。怎么做这样的同步?也许我可以使用来自java.util.concurrent
的东西。
答案 0 :(得分:6)
您也可以使用AtomicBoolean:
在没有显式同步的情况下执行此操作public class MyClass{
private AtomicBoolean flag = new AtomicBoolean(false);
public void method(){
if(flag.compareAndSet(false, true)) {
//do some bulk operation, should be synchronized
}
//some other staff
}
}
如果之前没有输入任何内容,则只会进入该块,并且是线程安全的。
当然,块中可能还有其他东西需要同步。但是,这适用于所述问题。
答案 1 :(得分:2)
您的代码看起来像AtomicBoolean
的完美用例,它有一个方法compareAndSet
,它以原子方式检查布尔值,并在检查返回预期值时设置它:
private AtomicBoolean flag = new AtomicBoolean();
public void method() {
if (flag.compareAndSet(false, true)) {
// ...
}
// other stuff
}
答案 2 :(得分:1)
您可以使用synchronized(this){/*ToDo - synchronised code here*/}
或者,如果获取对象的监视器将导致并发问题,则可以在对象的某个字段上进行同步。
答案 3 :(得分:1)
这样你可以使用synchronized块:
synchronized(this)
{
// synchronized block
}
答案 4 :(得分:0)
不要忘记UIWebView
,它比Java的内置锁定更强大(因此更危险)。它可以让你做这样的事情:
java.util.concurrent.locks.Lock