我一直在读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
}
}
}
我可以通过方法调用访问外部变量来锁定/同步它吗。?
是的,你能做到。如果不能,代码将无法编译。
synchronized()
将对象作为“参数”。它确保两个线程不能同时进入该对象上的同步块。
因此,如果data.getAlbums()
返回一个列表,则发布的代码将在该列表上同步,并且当第一个线程尚未退出其同步块时,没有其他线程能够输入在该列表上同步的块。
请注意,强制执行线程安全性是一种非常糟糕的策略。每次访问数据时,您都必须确保正确同步。这很容易出错,并且很容易导致死锁。您最好将对相册的所有访问封装到一个定义良好的类中,该类负责适当的同步,而不是返回一个非线程安全的列表,并依赖每个调用方应用适当的同步。
问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。
我正在编写的代码需要在几个静态方法之间进行一些同步。我的目标是阻止执行这些方法中的任何一个,如果其中一个执行。例如: 现在让我们假设下面的代码是从代码中的某个地方执行的: 我的问题是: > 它实际上是同步的吗?methodA和methodB不会同时运行吗? 如果是,methodA调用methodB会不会造成死锁?
我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?
假设我有三个类:,,和 我从类a传递一个变量,该变量将传递的变量设置为类数据中的变量,使用数据的类,并尝试使用数据的类获取数据()在类
本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对