java中的synchronized语句是否可以防止在访问线程WITHOUT synchronized语句的其他线程中同步对象的修改?我是多线程编程的新手,并且对我在这个问题上找到的文档感到困惑。
我们说我有以下代码。
public class Test {
public ArrayList<Integer> items = new ArrayList<Integer>();
public Test(ArrayList<Integer> items) {
this.items = items;
}
public void perform() {
synchronized(items) {
int size = items.size();
for(int n = 0; n < 10000; n++) {
for(int i = 0; i < size; i ++) {
items.set(i, items.get(i) + 1);
}
}
}
}
而内部循环在&#34;执行&#34;正在运行,是否有可能&#34;项目&#34;尽管整个循环包含在&#34; synchronized(items)&#34;中,但在另一个线程中进行了修改。声明?或者&#34;同步&#34;声明仅防止其他使用&#34; synchronized(items)&#34;他们自己要求锁定&#34;项目&#34;?
提前感谢您的帮助。
答案 0 :(得分:3)
执行在同步块之外修改项目的代码的线程可以自由修改项目,即使另一个线程正在执行同步代码。您必须小心在任何地方进行同步(没有编译器或运行时系统的帮助)。这是使编写多线程代码变得困难的一个方面。
答案 1 :(得分:3)
同步对象并不意味着没有其他线程可以修改它。这意味着也在该对象上同步的其他线程必须等待释放锁。
或者“synchronized”语句是否仅防止其他使用“synchronized(items)”本身请求锁定“items”的块进行修改?“
因此,这句话是正确的。
答案 2 :(得分:0)
synchronized语句表示它执行一些“非线程安全”代码(或“关键区域”),并阻止尝试运行synchronized语句(即非线程安全代码)的其他线程,直到它完成。
但是其他不执行关键区域的线程也不会被阻止。
同步语句使用“互斥锁”。互斥体说一个对象,一个关键区域修改的对象。 (同步声明中的哪一个)
如果是你的,那就是
items
使用不同互斥锁的其他线程(不使用“项目”)也不会被阻止。
下面的可能对您有所帮助: http://en.wikipedia.org/wiki/Mutual_exclusion http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html