如何同步或锁定Java中的变量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (43)

让我使用这个小而简单的示例:

class Sample {
    private String msg = null;

    public void newmsg(String x){
        msg = x;
    }

    public String getmsg(){
        String temp = msg;
        msg = null;
        return temp;
    }
}

让我们假设这个函数newmsg()被其他我没有访问的线程调用。

我想使用synchonize方法来保证字符串msg每次只能被一个函数使用。换句话说,函数newmsg()不能与getmsg()。同时运行。

提问于
用户回答回答于

这很简单:

class Sample {
    private String message = null;
    private final Object lock = new Object();

    public void newMessage(String x) {
        synchronized (lock) {
            message = x;
        }
    }

    public String getMessage() {
        synchronized (lock) {
            String temp = message;
            message = null;
            return temp;
        }
    }
}

请注意,我没有让方法本身同步或同步this。我坚信,只有获取代码才能访问的对象锁定是个好主意,除非您故意公开锁定。它使得更容易让自己放心,没有别的东西会以与您的代码不同的顺序获取锁,等等。

用户回答回答于

对于这个功能,你最好不要使用锁。试试AtomicReference。

public class Sample {
    private final AtomicReference<String> msg = new AtomicReference<String>();

    public void setMsg(String x) {
        msg.set(x);
    }

    public String getMsg() {
        return msg.getAndSet(null);
    }
}

没有锁需要和代码更简单恕我直言。无论如何,它使用一个标准的构造来实现你想要的。

扫码关注云+社区