gpt4 book ai didi

Java 同步 : Synchronization method and synchronization block

转载 作者:行者123 更新时间:2023-11-29 08:05:43 27 4
gpt4 key购买 nike

我有一个多线程 Java 应用程序。在一种方法中,需要同步一个 ArrayList。由于 arrayList 不是线程安全的,所以我必须使用同步。问题是 ArrayList 类型的对象不是对象的成员变量。方法原型(prototype)如下:

public void simultaneousAccess(ArrayListWrapper aListWrapper){
ArrayList list = aListWrapper.getList();
//...Codes manipulate the list
}

由于多线程,我应该使用

一个)

 public void synchronized simultaneousAccess(ArrayListWrapper aListWrapper){
ArrayList list = aListWrapper.getList();
//...Codes manipulate the list
}

或者

B)

public void simultaneousAccess(ArrayListWrapper aListWrapper){
ArrayList list = aListWrapper.getList();
Synchronized(list){
//...Codes manipulate the list
}
}

从性能测试来看,两者都不起作用。但我不知道为什么?

这里是完整的源代码:

package com.juhani.prototype.sync;

import java.util.ArrayList;

public class ArrayListWrapper {
public ArrayList<Integer> aList = new ArrayList<Integer>();

public ArrayListWrapper(){
Integer one = new Integer(1);
Integer two = new Integer(2);
Integer three = new Integer(3);

aList.add(one);
aList.add(two);
aList.add(three);
}
}

package com.juhani.prototype.sync;

import java.util.ArrayList;

public class TestClass {

public int count_test=0;

public synchronized void test(ArrayListWrapper listWrapper){
ArrayList<Integer> list = listWrapper.aList;
int temp = list.get(1)+1;
list.set(1,temp);
}

public void testBlock(ArrayListWrapper listWrapper){
ArrayList<Integer> list = listWrapper.aList;
synchronized(list){
int temp = list.get(1)+1;
list.set(1,temp);
}
}

}


package com.juhani.prototype.sync;

public class WorkerSyncObj extends Thread {

ArrayListWrapper listWrapper = null;
TestClass tc = null;
int number;

public WorkerSyncObj(int aNumber){
number = aNumber;
}

public void setListWrapper(ArrayListWrapper aListWrapper){
listWrapper = aListWrapper;
}

public void setTestClass(TestClass aTc){
tc = aTc;
}

public void run(){
int i = 1000;
for(int j=0;j<i;j++){
tc.testBlock(listWrapper);
System.out.println("Thread "+number+" is runing at loop "+j+" . index 1 value is:"+listWrapper.aList.get(1));
}
}
}

package com.juhani.prototype.sync.main;

import com.juhani.prototype.sync.ArrayListWrapper;
import com.juhani.prototype.sync.TestClass;
import com.juhani.prototype.sync.WorkerSyncObj;

public class TestMain {

public static void main(String[] args){

ArrayListWrapper list = new ArrayListWrapper();
TestClass tc = new TestClass();

WorkerSyncObj work1 = new WorkerSyncObj(1);
work1.setListWrapper(list);
work1.setTestClass(tc);
WorkerSyncObj work2 = new WorkerSyncObj(2);
work2.setListWrapper(list);
work2.setTestClass(tc);
WorkerSyncObj work3 = new WorkerSyncObj(3);
work3.setListWrapper(list);
work3.setTestClass(tc);

work1.start();
work2.start();
work3.start();



}

}

最佳答案

在第一种情况下,您锁定了 this 对象,而在第二种情况下,您锁定了 list 对象。如果您从不同的对象调用该方法但列表相同,则这可能是一个问题。这可能是第一种情况下出现异常的原因。
或者,您可以尝试一些内置的并发类型,例如 Collections.synchronizedListCopyOnWriteArrayList

关于Java 同步 : Synchronization method and synchronization block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11390139/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com