【问题标题】:synchronized a variable through a method from a static class通过静态类中的方法同步变量
【发布时间】:2014-05-31 07:46:51
【问题描述】:

我一直在阅读有关 java 中的同步的内容,但我有一个问题。 所以我看到的例子是一个类在本地对象上创建一个同步块。或同步方法。这两个都不适合我的情况。所以我有一个类的静态实例,它包含来自整个应用程序的所有数据。该类上的变量被创建为“私有”,我创建了 getter 来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。由于它们是作为私有创建的,因此我使用如下同步块...

public class Music{
    private ArrayList<Album> albums;
    private static Music musicObject = new Music();

    public ArrayList<Album> getAlbums()
    {
         return albums;
    }
    public Music getInstance()
    {
         return musicObject;
    }
}

public class Album {

    private Date releaseDate;

    private String singer;

    public Date getReleaseDate()
    {
        return releaseDate;
    }

    public String getSinger()
   {
        return releaseDate;
   }  
}
public class AlbumRetrieval
{
   private Music data;

   public AlbumRetrieval()
   {
      data = Music.getInstance();
      synchronized(data.getAlbums())
      {
          //No other thread can access the albums variable in here
      }
   }
}

我可以通过方法调用访问外部变量来锁定/同步它吗?

【问题讨论】:

  • data.getAlbums() 返回的是什么?请分享更多信息。
  • 为什么要锁在外面的东西?

标签: java


【解决方案1】:

是的,你可以这样做。如果不能,代码将无法编译。

synchronized() 将对象作为“参数”。它确保两个线程不能同时进入这个对象上的同步块。

因此,如果data.getAlbums() 返回一个列表,则发布的代码会在此列表上同步,并且当第一个线程尚未退出其同步块时,其他线程将无法进入与此完全相同的列表同步的块.

请注意,强制执行线程安全是一个非常糟糕的策略。每次访问数据时,您都必须确保正确同步。这非常容易出错,并且很容易导致死锁。您最好将所有对相册的访问封装到一个定义良好的类中,该类负责正确的同步,而不是返回一个非线程安全的列表并依赖每个调用者来应用适当的同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 2019-04-01
    • 1970-01-01
    • 2012-06-24
    • 2016-09-21
    • 2013-08-06
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多