Java:您可以在不显式创建块的情况下同步变量吗?

时间:2015-10-28 20:33:49

标签: java concurrency

是否可以同步变量,以便隐式假设所有对该变量的引用都是同步的?我正在思考以下内容:

synchronized List l = new LinkedList(); // I know this isn't valid

l.add(4)
l.set(0, new Integer(5));
// add a bunch of things
l.get((int) (Math.random()*l.size()));

将编译为

List l = new LinkedList();

synchronized(l){
  l.add(4)
}
Integer temp = new Integer(5);
synchronized(l){
  l.set(0, temp);
}
// add a bunch of things
double temp2 = Math.random();
synchronized(l){
  int temp3 = l.size()
}
int temp4 = (int) temp3;
synchronized(l){
  l.get(temp4);
}

编辑这只是使用List的示例。我正在为我可能创建的任何对象寻找一种通用的方法。

2 个答案:

答案 0 :(得分:3)

不,你不能。

有一些类似AtomicInteger的课程可能对您有帮助。 阅读更多关于原子类的信息: Practical uses for AtomicInteger

在某些情况下,您可以将volatile关键字用于原语,例如int。

答案 1 :(得分:1)

不,你不能,也不,你不应该。

要问的第一个问题是,你会得到哪个锁?您需要锁定对象或保留所有对象的所有锁的外部缓存。

第一种方法会导致数千次死锁。如果对象已经是线程安全并且已经自行锁定怎么办?监视器是不可重入的,这意味着尝试两次锁定同一对象的线程将会死锁。

第二种方法可行,但是,什么时候释放这些锁的内存?对于所有对象的所有锁(甚至那些GC回收的对象),您将获得一个巨大的缓存。这个缓存只会增长,最终会占用你所有的记忆。

面向方面的编程可以解决此类问题。但是它需要第三方库和字节码重写。