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){..}
的理解是否正确
假设:
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
之外,任何线程都不会访问数据。感谢您给出了迄今为止的答案,我将对问题进行编辑,以使其更加清晰。