synchronized语句java - 它们与非同步代码完全相同吗?

时间:2013-06-12 17:42:51

标签: java concurrency synchronization

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;?

提前感谢您的帮助。

3 个答案:

答案 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