当前位置: 首页 > 知识库问答 >
问题:

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

伍光济
2023-03-14

我一直在读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
      }
   }
}

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

共有1个答案

扶开诚
2023-03-14

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

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

因此,如果data.getAlbums()返回一个列表,则发布的代码将在该列表上同步,并且当第一个线程尚未退出其同步块时,没有其他线程能够输入在该列表上同步的块。

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

 类似资料:
  • 问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。

  • 我正在编写的代码需要在几个静态方法之间进行一些同步。我的目标是阻止执行这些方法中的任何一个,如果其中一个执行。例如: 现在让我们假设下面的代码是从代码中的某个地方执行的: 我的问题是: > 它实际上是同步的吗?methodA和methodB不会同时运行吗? 如果是,methodA调用methodB会不会造成死锁?

  • 我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?

  • 本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对

  • 假设我有三个类:,,和 我从类a传递一个变量,该变量将传递的变量设置为类数据中的变量,使用数据的类,并尝试使用数据的类获取数据()在类