首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:您能在不显式创建块的情况下同步变量吗?

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

Stack Overflow用户
提问于 2015-10-28 20:33:48
回答 2查看 41关注 0票数 1

是否有可能同步一个变量,以便隐式地假定对该变量的所有引用都是同步的?我的想法如下:

代码语言:javascript
复制
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()));

会被汇编成

代码语言:javascript
复制
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的一个例子。我正在为我可能创建的任何对象寻找一种通用的方法来完成这个任务。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-28 20:39:06

不你不能。

有些类,如AtomicInteger,可能会对您有所帮助。在这里阅读更多有关原子类的内容:Practical uses for AtomicInteger

在某些情况下,您可以对原语(如int )使用volatile关键字。

票数 3
EN

Stack Overflow用户

发布于 2015-10-28 20:47:02

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

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

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

但是,第二种方法可以在什么时候释放这些锁的内存?您将为所有对象(甚至GC回收的对象)的所有锁提供一个巨大的缓存。这个缓存只会增长,最终会占用您所有的内存。

面向方面的编程可以解决这类问题.然而,它需要第三方库和字节码重写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33401092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档