我有一个静态的HashMap和三个尝试同时从相应类中访问HashMap的线程。
每个线程任务都是获取指定键的列表值,处理列表上的一些操作(修改列表)。并将处理后的列表放在HashMap中。
我想让其他线程尝试访问HashMap,等待当前线程完成处理并修改HashMap。
在某些情况下,流程是这样的,
线程A被检索到HashMap,而线程A正在处理HashMap列表,其他线程B检索HashMap并开始处理。
实际行为必须如下:
Thread A -> retrieves HashMap -> process -> put value in HashMap.
Thread B -> retrieves HashMap -> process -> put value in HashMap.
Thread C -> retrieves HashMap -> process -> put value in HashMap.
逻辑:
帮助我将逻辑转换为代码,或者微笑接受任何建议。
答案 0 :(得分:1)
您可以使用 ConcurrentHashMap 代替HashMap。 ConcurrentHashMap提供了更好的性能,并减少了在其他线程访问时锁定整个HashMap的开销。 您也可以在此页面上找到更多详细信息 - http://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/
答案 1 :(得分:0)
你可以按照上面的建议使用ConcurrentHashMap,也可以使用类级别锁。我的意思是在静态方法上使用synchronized关键字.eg
public class SynchronizedExample extends Thread {
static HashMap map = new HashMap();
public synchronized static void execute() {
//Modify and read HashMap
}
public void run() {
execute();
}
}
另外正如其他人所提到的,如果使用同步方法会导致性能瓶颈,这取决于你所做的原子功能。 您还可以检查类级别锁定与对象级别锁定(虽然它几乎相同,但请检查它。)
答案 2 :(得分:0)
你真的可以使用ReentrantReadWriteLock。这是链接。
Javadoc for ReadWriteReentrant lock
我会像这样实现这个功能..........
session_start();
$_SESSION["uname"] = $_POST["username"];
不仅您的地图是线程安全的,吞吐量也更好。