1

java中的同步语句是否可以防止在没有同步语句的情况下访问线程的其他线程中同步对象的修改?我是多线程编程的新手,对我在这个问题上找到的文档感到困惑。

假设我有以下代码。

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);
              }
        }
    }
}

当“执行”中的内部循环正在运行时,尽管整个循环包含在“同步(项目)”语句中,但是否可以在另一个线程中修改“项目”?或者“同步”语句是否仅防止其他使用“同步(项目)”本身请求锁定“项目”的块的修改?

提前感谢您的帮助。

4

3 回答 3

3

在同步块之外执行修改项目的代码的线程可以自由修改项目,即使另一个线程正在执行同步代码。您必须小心地在任何地方进行同步(编译器或运行时系统没有帮助)。这是使编写多线程代码变得困难的一个方面。

于 2013-06-12T17:46:40.553 回答
3

在一个对象上同步并不意味着没有其他线程可以修改它。这意味着在该对象上同步的其他线程必须等待您的锁被释放。

或者“同步”语句是否仅防止其他使用“同步(项目)”本身请求锁定“项目”的块的修改?

因此,这个说法是正确的。

于 2013-06-12T17:57:18.843 回答
0

同步语句表示它执行一些“非线程安全”代码(或“关键区域”),并阻止其他尝试运行同步语句(即非线程安全代码)的线程,直到它完成。

但其他没有执行关键区域的线程不会被阻塞。

同步语句使用“互斥锁”。mutex 表示一个对象,关键区域修改该对象。(同步声明中的哪一个)

在你的情况下,它是

items

.

其他使用不同互斥体的线程(不使用“项目”)也不会被阻塞。

以下可能对您有所帮助: http ://en.wikipedia.org/wiki/Mutual_exclusion http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

于 2013-06-12T18:16:40.190 回答