gpt4 book ai didi

java - 读取和写入共享线程变量

转载 作者:太空宇宙 更新时间:2023-11-04 07:30:57 24 4
gpt4 key购买 nike

首先,我对线程和共享变量很陌生。所以请善待我;-)

我有一个名为Routing的类。该类接收并处理消息。如果消息的类型为A,则Routing对象应将其传递给实现Runnable接口(interface)的ASender对象。如果消息的类型为 B,则 Routing 类应将其传递给 BSender 对象。

但是 ASenderBSender 对象具有公共(public)变量,应将其存储到 Routing 对象中。

我现在的想法是在路由对象和 getter/setter 中将变量声明为同步/ volatile 。

这是同步代码的正确方法吗?或者缺少什么?

编辑:添加了基本的代码思想。

路由类

public class Routing {

private synchronized Hashtable<Long, HashSet<String>> reverseLookup;
private ASender asender;
private BSender bsender;

public Routing() {
//Constructor work to be done here..
reverseLookup = new Hashtable<Long, HashSet<String>>();

}

public void notify(TopicEvent event) {

if (event.getMessage() instanceof AMessage) {
asender = new ASender(this, event.getMessage())

} else if (event.getMessage() instanceof BMessage) {
bsender = new BSender(this, event.getMessage())

}
}

public synchronized void setReverseLookup(long l, Hashset<String> set) {
reverseLookup.put(l, set);

}

public synchronized Hashtable<Long, Hashset<String>> getReverseLookup() {
return reverseLookup;
}
}

ASender 类

public class ASender implements Runnable {

private Routing routing;
private RoutingMessage routingMessage;

public ASender(Routing r, RoutingMessage rm) {
routing = r;
routingMessage = rm;
this.run();
}

public void run() {
handleMessage();
}

private void handleMessage() {
// do some stuff and extract data from the routing message object

routing.setReverseLookup(somethingToSet)
}
}

最佳答案

一些评论:

  1. Hashtable 是一个线程安全的实现,您不需要另一个“synchronized”关键字,请参阅 thisthis了解更多信息
  2. 避免耦合,尝试使用接口(interface)或将哈希表传递给发件人,请参阅 this了解更多信息
  3. 根据发件人的数量,您可能需要使用 ConcurrentHashMap ,大大提高了性能,参见ConcurrentHashMap and Hashtable in JavaJava theory and practice: Concurrent collections classes

这会得出类似......的结论:

public interface IRoutingHandling {

void writeMessage(Long key, HashSet<String> value);

}

public class Routing implements IRoutingHandling {

private final Hashtable<Long, HashSet<String>> reverseLookup;

private ASender asender;
private BSender bsender;

public Routing() {
//Constructor work to be done here..
reverseLookup = new Hashtable<Long, HashSet<String>>();
}

public void notify(TopicEvent event) {
if (event.getMessage() instanceof AMessage) {
asender = new ASender(this, event.getMessage())

} else if (event.getMessage() instanceof BMessage) {
bsender = new BSender(this, event.getMessage())

}
}

@Override
public void writeMessage(Long key, HashSet<String> value) {
reverseLookup.put(key, value);
}

}

public class ASender implements Runnable {

private IRoutingHandling _routingHandling;

public ASender(IRoutingHandling r, RoutingMessage rm) {
_routingHandling = r;
routingMessage = rm;
this.run();
}

public void run() {
handleMessage();
}

private void handleMessage() {
// do some stuff and extract data from the routing message object

_routingHandling.writeMessage(somethingToSetAsKey, somethingToSetAsValue)
}

}

关于java - 读取和写入共享线程变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17695095/

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