Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 以不同类作为锁的同步块_Java_Multithreading_Synchronization - Fatal编程技术网

Java 以不同类作为锁的同步块

Java 以不同类作为锁的同步块,java,multithreading,synchronization,Java,Multithreading,Synchronization,我想知道我对synchronized(x.class){..}的理解是否正确 假设: 我在一个类中有两个变量,如果需要,它们将被初始化。但只有一次 我想阻止不同线程对每个变量的多重访问 我只想对变量进行分块,而不是完整的SingletonExample实例 示例: public class SingletonExample{ private volatile SingletonA var; private volatile SingletonB tar; public

我想知道我对
synchronized(x.class){..}
的理解是否正确

假设:

  • 我在一个类中有两个变量,如果需要,它们将被初始化。但只有一次

  • 我想阻止不同线程对每个变量的多重访问

  • 我只想对变量进行分块,而不是完整的SingletonExample实例

  • 示例:

    public class SingletonExample{
    
        private volatile SingletonA var;
        private volatile SingletonB tar;
    
        public void initVarOnDemand1() {
            if (var == null) {
                synchronized (SingletonA.class) {
                    if (var == null) {
                        var = SingletonA.getInstance(1);
                    }
                }
            }
        }
    
        public void initVarOnDemand2() {
            if (var == null) {
                synchronized (SingletonA.class) {
                    if (var == null) {
                        var = SingletonA.getInstance(2);
                    }
                }
            }
        }
    
        public void initTarOnDemand1() {
            if (tar == null) {
                synchronized (SingletonB.class) {
                    if (tar == null) {
                        tar = new SingletonB.getInstance(1);
                    }
                }
            }
        }
    
        public void initTarOnDemand2() {
            if (tar == null) {
                synchronized (SingletonB.class) {
                    if (tar == null) {
                        tar = SingletonB.getInstance(2);
                    }
                }
            }
        }
    }
    
    我的最终目标是,没有两个线程可以同时更改变量
    var
    ,也没有两个线程可以同时更改变量
    tar

    但我不想阻止访问不同变量的两个线程。

    因此,我将块同步与每个类一起用作锁对象


    这是我想要的正确方式吗?(我希望我解释得足够好-很抱歉我的英语不好)

    更好的方法是使用原子引用。比较数据集:

    private final AtomicReference<Integer> var = new AtomicReference<>();
    
    public void foo() {
      var.compareAndSet(null, 1);
    }
    
    public void bar() {
      var.compareAndSet(null, -1);
    }
    
    private final AtomicReference var=new AtomicReference();
    公共图书馆{
    var.compareAndSet(null,1);
    }
    公共空白栏(){
    变量比较数据集(空,-1);
    }
    

    这仅在
    var
    的当前值等于第一个参数(在本例中为
    null
    )的情况下设置其值。

    您希望在类的所有实例中独占访问
    var
    ,还是仅在当前实例中独占访问?示例中的包装类…假设example.class本身是单例。它将初始化var和tar,它们也是单例。但是我希望初始化是原子的,并且是按需的。在Java中,您无法阻止不同的线程访问变量。使用
    synchronized
    可以防止的唯一事情是,可以防止不同线程同时在同一对象上同步。如果您不想让不同的线程同时访问某些数据,那么就由您自己来构造代码,这样,除了在某个唯一对象的
    synchronized(o)
    块中,
    o
    之外,任何线程都不会访问数据。感谢您给出了迄今为止的答案,我将对问题进行编辑,以使其更加清晰。