【发布时间】:2018-09-26 02:39:30
【问题描述】:
我研究了synchronized和volatile之间的区别,并写了一个不带volatile的例子,我认为它相当于带volatile的例子(由于获取时额外的同步)
Volatile 版本
public class Volatile extends Super {
private volatile int xCounter;
private volatile int yCounter;
@Override
public int getXCounter() {
return this.xCounter;
}
@Override
public int getYCounter() {
return this.yCounter;
}
@Override
public void incrementXCounter() {
synchronized (getLockXCounter()) {
this.xCounter++;
}
}
@Override
public void incrementYCounter() {
synchronized (getLockYCounter()) {
this.yCounter++;
}
}
}
没有 Volatile 的版本
public class NonVolatile extends Super {
private int xCounter;
private int yCounter;
@Override
public int getXCounter() {
synchronized (getLockXCounter()) {
return this.xCounter;
}
}
@Override
public int getYCounter() {
synchronized (getLockYCounter()) {
return this.yCounter;
}
}
@Override
public void incrementXCounter() {
synchronized (getLockXCounter()) {
this.xCounter++;
}
}
@Override
public void incrementYCounter() {
synchronized (getLockYCounter()) {
this.yCounter++;
}
}
}
超级类
public abstract class Super {
private final Object lockXCounter = new Object();
private final Object lockYCounter = new Object();
protected abstract int getXCounter();
protected abstract int getYCounter();
protected abstract void incrementXCounter();
protected abstract void incrementYCounter();
Object getLockXCounter() {
return lockXCounter;
}
Object getLockYCounter() {
return lockYCounter;
}
}
具体来说,以下两点提供的两个例子是否有等价性?
1) 性能
2) 线程安全
如果其中一个示例不能保证线程安全,请提供一个说明缺乏线程安全的示例。
【问题讨论】:
-
-
一般来说,同步比读取 volatile 更昂贵。您是否只是将其用作示例?因为 AtomicInteger 类可能是您开始时最好的选择(它在幕后使用 Unsafe 类)。
标签: java multithreading locking synchronized volatile