java中的synchronized方法问题

时间:2015-10-22 06:33:10

标签: java multithreading synchronized

我有三种不同的同步方法如下所示。

A:

asyncTask

B:

 public synchronized static int addCount1() {
        for (int i = 0; i < 10000; i++) {
            count++;
        }
        return count;
    }

C:

static void addCount2() {
    synchronized (TestDoubleThread.class) {
        for (int i = 0; i < 10000; i++) {
            count++;
        }
    }
}

所有这些都可以按照我的预期进行同步。但是,我想知道哪一个更好,哪一个之间有显着差异。特别是对于案例B和案例C.

这是我的完整代码:

void addCount3(String key) {
    synchronized (myMap.get(key)) {
        for (int i = 0; i < 10000; i++) {
            count++;
        }
    }
}

1 个答案:

答案 0 :(得分:4)

addCount2上同步{p> TestDoubleThread.classaddCount3TestDoubleThread返回的myMap.get(key)实例上同步addCount3("A");。由于您使用addCount2执行它,因此两个线程在同一对象上同步,因此必须等待另一个线程才能执行该方法。因此它的行为与addCount3(this.jobNmae)完全相同,它也会在同一个对象上同步。

另一方面,如果将其更改为addCount3,则每个线程将在另一个对象上同步,因此两个线程将能够同时执行count,并且function filter(arr, arg1, arg2){ var j = arr.length; while(j){ if (arr.indexOf(arg1) > -1 || arr.indexOf(arg2) > -1){ arr.splice(j - 1, 1); } j-- } } 会被搞砸。