我一直在阅读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
}
}
}
我可以通过方法调用访问它来锁定/同步外部变量。?
答案 0 :(得分:1)
是的,你可以这样做。如果你不能,代码将无法编译。
synchronized()
将对象作为“参数”。它确保两个线程不能同时在此对象上输入同步块。
因此,如果data.getAlbums()
返回一个列表,则发布的代码会在此列表上同步,并且当第一个线程尚未退出时,其他任何线程都无法输入在此完全相同的列表上同步的块同步块。
请注意,强制执行线程安全是一个非常糟糕的策略。每次访问数据时,您都必须确保正确同步。这非常容易出错,并且很容易导致死锁。您最好将对相册的所有访问封装到一个定义良好的类中,该类负责正确的同步,而不是返回非线程安全的列表,并依赖每个调用者来应用适当的同步。 p>