gpt4 book ai didi

Java线程并发

转载 作者:行者123 更新时间:2023-11-30 06:18:10 25 4
gpt4 key购买 nike

谁能告诉我以下示例中方法 stampaVector() 和 stampaVector2() 之间的区别?

public class ThreadConcurrence implements Runnable{

ArrayList<Integer> list=null;

public ThreadConcurrence(ArrayList<Integer> list){
this.list = list;
}

public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();

for(int i=0; i<5; i++){
list.add(i);
}

//Threads shares same list object
ThreadConcurrence tc1 = new ThreadConcurrence(list);
ThreadConcurrence tc2 = new ThreadConcurrence(list);

Thread t1 = new Thread(tc1);
Thread t2 = new Thread(tc2);
t1.start();
t2.start();
}

@Override
public void run() {
stampaVector();
//stampaVector2();
}

public void stampaVector(){
synchronized(this.list){
for(Integer i:this.list){
System.out.println("StampaVector: "+Thread.currentThread().getName()+" "+i);
}
}
}

public synchronized void stampaVector2(){
for(Integer i:this.list){
System.out.println("StampaVector2: "+Thread.currentThread().getName()+" "+i);
}
}
}

输出执行stampaVector():

StampaVector: Thread-0 0
StampaVector: Thread-0 1
StampaVector: Thread-0 2
StampaVector: Thread-0 3
StampaVector: Thread-0 4
StampaVector: Thread-1 0
StampaVector: Thread-1 1
StampaVector: Thread-1 2
StampaVector: Thread-1 3
StampaVector: Thread-1 4

输出执行stampaVector2():

StampaVector2: Thread-0 0
StampaVector2: Thread-1 0
StampaVector2: Thread-1 1
StampaVector2: Thread-1 2
StampaVector2: Thread-0 1
StampaVector2: Thread-1 3
StampaVector2: Thread-1 4
StampaVector2: Thread-0 2
StampaVector2: Thread-0 3
StampaVector2: Thread-0 4

对于方法 stampaVector2(),我希望 stampaVector() 的输出相同(一次只有一个线程访问列表对象)。

谢谢

最佳答案

当您将 synchronized 放在您正在同步 this 的方法上时。由于该类有两个实例,每个实例都能够获得对自身的锁定,因此它们同时运行(无阻塞)。

synchronize this.list 中,两个实例都有相同的 list 实例引用,因此它们都试图获取对单个对象的锁定,因此是相互的独家。

关于Java线程并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25084453/

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