【问题标题】:Any side effects of using the working instance object in synchronized block在同步块中使用工作实例对象的任何副作用
【发布时间】:2016-02-02 05:55:43
【问题描述】:

我正在创建一个类,我需要为我的用例在两个方法“insert”和“getItems”之间进行同步。虽然在我看来,按照下面的代码使用这两种方法不会产生任何副作用:-

public class EmailBuffer {

    private List<String> items = new ArrayList<String>();

    public void insertItem(String item) {
        synchronized (items) {
            items.add(item);
        }
    }

    public String[] getItems() {
        synchronized (items) {
            String[] objects = new String[items.size()];
            items.toArray(objects);
            items.clear();
            return objects;
        }
    }
}

但是如果使用上述代码会有任何副作用,谁能帮助我? 或者,我可以创建另一个实例变量 私有对象 object = new Object();并且可以在“insert”和“getItems”方法的同步块中使用它,但是这样,如果上面的代码根本没有任何问题,我将引入一个根本不需要的额外实例变量。

【问题讨论】:

  • 您的同步习语应该按预期工作,但逻辑有点可疑:我建议记录这样一个事实,即获取所有“项目”实际上会清除集合。
  • 是的,没错。文档正在等待中。我的要求是在检索到对象后清除条目,因此我必须清除列表。

标签: java


【解决方案1】:

只要你不暴露你的items,就不应该有任何意想不到的副作用。您的代码应该可以按预期工作。

【讨论】:

  • 虽然我也有同样的期待,但非常感谢您的确认。
  • 这是一篇关于同步块的好文章。 tutorials.jenkov.com/java-concurrency/synchronized.html
  • @Salivan 我不鼓励你使用synchronize(this) 和使用synchronized 方法,因为它们有一个邪恶的属性:每个可以访问你的对象的组件都可以锁定它并干扰你的同步。锁定私有成员(实例或静态,具体取决于应用程序)是更好的做法,因为您现在可以对同步的工作方式做出坚定的假设。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多