是否有可能同步一半的if块?

时间:2015-09-29 11:27:00

标签: java multithreading synchronization

这个问题似乎很明显,但无论如何我都不清楚。

我有以下课程:

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的东西。

5 个答案:

答案 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