gpt4 book ai didi

java - 同步方法中的访问标志?

转载 作者:行者123 更新时间:2023-11-30 11:48:13 76 4
gpt4 key购买 nike

我在浏览大学类里面的一些 pdf 文件时注意到了这段代码:

public class MyMemoryElements {
private String x = "";

public MyMemoryElements(String message){
this.x = message;
}

@Override
public boolean equals(Object o){
if(o instanceof MyMemoryElements ){
MyMemoryElements tmp = (MyMemoryElements)o;
if(tmp.toString().equalsIgnoreCase(this.x))
return true;
return false;
}
return false;

}

@Override
public String toString(){
return this.x;
}
}

和主要代码:

public class MainMemory {
private Vector<MyMemoryElements> storage;
private boolean canAccess = true;
private int counter = -1;

public MainMemory(){
storage = new Vector<MyMemoryElements>();
}

public synchronized MyMemoryElements take(String s) {
System.out.print("Method take has been invoked by "+s+". Element is:");
while (!canAccess || storage.size()==counter+1) {
try {
wait();
} catch (InterruptedException e) {}
}
canAccess = false;
counter++;
MyMemoryElements x = storage.elementAt(counter);
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {}
notifyAll();
System.out.println(x.toString());
canAccess = true;
return x;
}

public synchronized void update(MyMemoryElements element) {
System.out.println("Producer is inserting element "+ element.toString());
while (!canAccess) {
try {
wait();
} catch (InterruptedException e) {}
}
canAccess = false;
this.storage.add(element);
notifyAll();
canAccess = true;
}
}

考虑到方法是同步的,我似乎无法理解对 canAccess 变量的需求(也不理解标志在 notifyAll 和之前没有)

编辑:另一个问题:所有这些代码有什么意义吗?我的意思是它所做的只是获取并向 vector 添加一些东西。这些 Action 不是已经在 vector 上同步了吗?所有这些代码只是为了让我们打印一些照片?

最佳答案

我同意 - 不需要这些额外的检查,因为这些方法被标记为 synchronized 。

(看起来有人想要真的、真的确定没有同步问题。:-)

具有讽刺意味的是,可以说 canAccess 不是线程安全的。因此,即使没有同步方法,这也不一定是合适的选择。

关于java - 同步方法中的访问标志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8956709/

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