通过静态类中的方法同步变量

时间:2014-05-31 07:46:51

标签: java

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

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
      }
   }
}

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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