`
cloudeagle_bupt
  • 浏览: 541126 次
文章分类
社区版块
存档分类
最新评论

ConcurrencyHashMap线程不安全的代码示例

 
阅读更多
package prefetch;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hama.graph.GraphJobMessage;
import org.apache.hama.util.WritableUtils;


public class ConcurrencyTest {

	public ConcurrentHashMap<WritableComparable, GraphJobMessage> storage = new ConcurrentHashMap<WritableComparable, GraphJobMessage>();

	public ConcurrencyTest() {
	}

	// 测试多线程写入会冲掉的问题

	public static void main(String[] args) {
		try {
			ConcurrencyTest chmt = new ConcurrencyTest() ;   
			MessageProdcer mg1 = new MessageProdcer(chmt) ;
			Thread t1 = new Thread(mg1)  ;
			MessageProdcer mg2 = new MessageProdcer(chmt) ;
			Thread t2 = new Thread(mg2)  ; //启动两个生产者线程
			t1.start() ;
			
//			t2.start() ;
			Thread.sleep(1000) ;
			while(true) {
				if(!t1.isAlive()) {
					t2.start() ;
					break ;
				}
			}
			
			
			t1.join() ;
			t2.join() ;
			
			System.out.println("storage size: " + chmt.storage.size());
			for(Map.Entry<WritableComparable, GraphJobMessage> e : chmt.storage.entrySet()) 
				System.out.println("Key: " + e.getKey() + " Value Size: " + e.getValue().getNumOfValues()) ;
		} catch (InterruptedException e1) {
			e1.printStackTrace();
		}
	}

	public void add(GraphJobMessage item) {
		<pre name="code" class="java">if (!storage.containsKey(item.getVertexId())) {
			storage.putIfAbsent(item.getVertexId(), item);
		} else {
			storage.get(item.getVertexId()).addValuesBytes(
					item.getValuesBytes(), item.size());
		}


上述代码,执行3次,结果始终为:

storage size: 1Key: 5 Value Size: 200000

但是将这段修改为:

			t2.start() ;
//			Thread.sleep(1000) ;
//			while(true) {
//				if(!t1.isAlive()) {
//					t2.start() ;
//					break ;
//				}
//			}

结果变为:

storage size: 1
Key: 5 Value Size: 199999

storage size: 1
Key: 5 Value Size: 200000

storage size: 1
Key: 5 Value Size: 199998


可见这段代码存在并发安全问题:

	public void add(GraphJobMessage item) {
		if (!storage.containsKey(item.getVertexId())) {
			storage.putIfAbsent(item.getVertexId(), item);
		} else {
			storage.get(item.getVertexId()).addValuesBytes(
					item.getValuesBytes(), item.size());
		}
	}

可见ConcurrencyHashMap也 不是绝对安全的,要看实际情况

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics