多线程安全

多线程安全技术

1. 代码示例

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class SourcePool {
	private static Map<Source, List<Node>> addressPool = new ConcurrentHashMap<Source, List<Node>>();
	
	synchronized static void addSource(Node address, Source source) {
		List<Node> addressList = addressPool.get(source);
		
		if (addressList == null) {
			addressList = new ArrayList<>();
			addressPool.put(source, addressList);
		}
		
		if (!addressList.contains(address)) {
			addressList.add(address);
		}
	}
	
	synchronized static void addSource(Node address, List<Source> sourceList) {
		for (Source source : sourceList) {
			addSource(address, source);
		}
	}
	
	synchronized static void removeSource(Node address, Source source) {
		List<Node> addressList = addressPool.get(source);
		if (addressList == null) {
			return;
		}
		if (!addressList.contains(address)) {
			return;
		}
		addressList.remove(address);
	}
	
	synchronized static void removeSource(Node address, List<Source> sourceList) {
		for (Source source : sourceList) {
			removeSource(address, source);
		}
	}
	
	synchronized static void removeSource(Node address) {
		List<Source> sourceList = HolderPool.getSourceList(address);
		removeSource(address, sourceList);
	}
	
	synchronized static List<Node> getAddress(Source source) {
		return addressPool.get(source);
	}
	
	synchronized static String getHolderInfo() {
		StringBuffer res = new StringBuffer();
		
		List<Source> sourceList = getSourceList();
		int sourceCount = sourceList.size();
		
		res.append("当前").append(sourceCount).append("个资源:");
		for (int index = 0; index < sourceCount; index++) {
			res.append("\n").append(index + 1).append("、");
			Source source = sourceList.get(index);
			res.append(source).append(":");
			
			List<Node> holderList = addressPool.get(source);
			for (Node holder : holderList) {
				res.append("\n\t").append(holder);
			}
		}
		res.append("\n");
		
		return res.toString();
	}
	
	private static List<Source> getSourceList() {
		List<Source> sourceList = new ArrayList<>();
		
		for (Source source : addressPool.keySet()) {
			sourceList.add(source);
		}
		
		return sourceList;
	}
	
}

2. 解析

Map<Source, List> addressPool 在代码中是static的,这个类主要是对其进行处理,因为这个类是多线程的,为了保证数据的可靠性和安全性,需要对方法加锁(synchronized),保证同一时刻只有一个线程可以访问其中的某一个方法

posted @ 2023-05-25 14:55  Geek李  阅读(8)  评论(0)    收藏  举报