Java同步HashMap中的size(),put(),remove(),get()是否为primefaces?

我将Java Map声明为

Map map = Collections.synchronizedMap(new HashMap()); 

处理并发问题,并在地图上同步其上的所有操作。 但是,我读到当操作是primefaces操作时,synchronizedMap上不需要synchronizedMap 。 我检查了Java API,HashMap的文档似乎没有提到哪些是primefaces的,所以我不确定是哪些。

我正在同步以下对地图的调用:

 map.size() map.put() map.remove() map.get() 

但如果有些是primefaces的,那么似乎并不需要同步。 哪个是primefaces的?

顾名思义的同步映射是同步的。 对其上的任何其他操作而言,其上的每个操作都是primefaces的。

您可以将其视为同步映射的每个方法都使用synchronized关键字声明。

请记住,尽管单个操作是primefaces操作,但如果将它们组合起来,它们就不再是primefaces操作,例如:

 String value = map.get("key"); map.put("key", value+"2"); 

不等于您的自定义同步代码:

 synchronized (map) { String value = map.get("key"); map.put("key", value+"2"); } 

反而:

 synchronized (map) { String value = map.get("key"); } synchronized (map) { map.put("key", value+"2"); } 

不保证HashMap具有primefaces操作。 从不同的线程(甚至size() )调用其任何方法可能会破坏映射。 但是,使用Collections.synchronizedMap获取的映射将使每个调用同步(因此是线程安全的)。

但是,您可能需要更高级别的同步。 例如,如果您测试是否存在密钥,读取大小,或以其他方式从地图访问某些内容,然后根据结果对地图执行其他操作,则地图可能在两次调用之间发生了更改。 在这种情况下,您需要一个synchronized块来使整个事务成为primefaces,而不是同步映射(只使每个调用成为primefaces)。

地图本身是同步的,而不是一些内部锁。 在地图上运行多个操作需要同步块。 无论如何,如果您使用的是JDK 1.6或更高版本,则应考虑使用ConcurrentHashMap

当您需要确保数据一致性时, ConcurrentHashMap是最佳选择,并且每个线程都需要当前的地图视图。 如果性能至关重要,并且每个线程仅将数据插入到地图中,并且读取的频率较低,则使用您概述的路径。 也就是说,当一次只有一个线程访问ConcurrentHashMap时,性能可能会更差,但是当多个线程同时访问映射时,性能会明显提高。