如何在Java中同步或锁定变量? [英] How to synchronize or lock upon variables in Java?

查看:322
本文介绍了如何在Java中同步或锁定变量?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

让我使用这个小而简单的样本:

Let me use this small and simple sample:

class Sample {
    private String msg = null;

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

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

让我们假设函数 newmsg ()由我无权访问的其他线程调用。

Let's assume the function newmsg() is called by other threads that I don't have access to.

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

I want to use the synchonize method to guarantee that the string msg is only used by one function per time. In other words, function newmsg() cannot run at the same time as 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;
        }
    }
}

请注意我没有使方法本身同步或在这个上同步。我坚信只对你的代码才能访问的对象获取锁定是个好主意,除非你故意暴露锁。这样可以更容易地让自己放心,没有其他任何东西会以与代码不同的顺序获取锁定等。

Note that I didn't either make the methods themselves synchronized or synchronize on this. I firmly believe that it's a good idea to only acquire locks on objects which only your code has access to, unless you're deliberately exposing the lock. It makes it a lot easier to reassure yourself that nothing else is going to acquire locks in a different order to your code, etc.

这篇关于如何在Java中同步或锁定变量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆