Java 通过方法从静态类同步变量

Java 通过方法从静态类同步变量,java,Java,我一直在读java中的同步,我有一个问题。 我看到的例子是一个类在本地对象上创建一个同步块。或同步方法。这两个都不适合我的情况。所以我有一个类的静态实例,它保存了整个应用程序中的所有数据。该类上的变量被创建为“private”,我创建了getter来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。因为它们被创建为private,所以我使用同步块,如下所示 public class Music{ private ArrayList<Album> albums;

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

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
      }
   }
}
公共音乐课{
私人ArrayList专辑;
私有静态音乐musicObject=新音乐();
公共阵列列表getAlbums()
{
归还相册;
}
公共音乐实例()
{
返回音乐对象;
}
}
公开课相册{
私人日期发布日期;
私人弦乐歌手;
公共日期getReleaseDate()
{
返回发布日期;
}
公共字符串getSinger()
{
返回发布日期;
}  
}
公共类检索
{
私人音乐资料;
公共检索()
{
data=Music.getInstance();
已同步(data.getAlbums())
{
//没有其他线程可以访问此处的albums变量
}
}
}

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

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

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

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


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

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