gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:55:13 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

关于java - 通过静态类中的方法同步变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23967739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com