是否有可能同步一个变量,以便隐式地假定对该变量的所有引用都是同步的?我的想法如下:
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的一个例子。我正在为我可能创建的任何对象寻找一种通用的方法来完成这个任务。
发布于 2015-10-28 20:39:06
不你不能。
有些类,如AtomicInteger,可能会对您有所帮助。在这里阅读更多有关原子类的内容:Practical uses for AtomicInteger。
在某些情况下,您可以对原语(如int )使用volatile关键字。
发布于 2015-10-28 20:47:02
不,你不能,不你不应该。
要问的第一个问题是,你会得到哪个锁?您要么需要锁定对象,要么为所有对象保留所有锁的外部缓存。
第一种方法将导致上千个死锁。如果对象已经是线程安全的,并且已经锁定了自己,那该怎么办?监视器是不可重入的,这意味着试图两次锁定同一个对象的线程会死锁。
但是,第二种方法可以在什么时候释放这些锁的内存?您将为所有对象(甚至GC回收的对象)的所有锁提供一个巨大的缓存。这个缓存只会增长,最终会占用您所有的内存。
面向方面的编程可以解决这类问题.然而,它需要第三方库和字节码重写。
https://stackoverflow.com/questions/33401092
复制相似问题