package com.nier;
/**
* Description 通过类锁 将不可切割的业务锁上
* @author yunuotianming
* @date 2018-07-25 17:22
**/
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class TestSynchronized {
private static Map<Integer,User> concurrentMap = new ConcurrentHashMap<Integer, User>(256);
public void save(User user) {
updateDelay(user);
}
private synchronized static void updateDelay(User user){
if(containsKey(user.getId())){
User userOld = getValue(user.getId());
user.setMoney(user.getMoney() + userOld.getMoney());
putElement(user.getId(),user);
}else{
putElement(user.getId(),user);
}
}
private synchronized static void putElement(Integer key, User value){
concurrentMap.put(key,value);
}
private synchronized static boolean containsKey(Integer key){
return concurrentMap.containsKey(key);
}
private synchronized static User getValue(Integer key){
return concurrentMap.get(key);
}
private synchronized static void clearMap(){
concurrentMap.clear();
}
public void saveToDB(){
if(concurrentMap.size() != 0){
//获取清空EMAIL_TRACK_MAP前的旧数据Map 因其他线程可能并发更新EMAIL_TRACK_MAP,故需同步clear()方法 以防删除刚put的元素
Map<Integer, User> currentDataMap = getCurrentDataMap();
for (Map.Entry<Integer, User> emailTrackEntry : currentDataMap.entrySet()) {
User value = emailTrackEntry.getValue();
if(value != null){
//入库逻辑
System.out.println(value);
}
}
}
}
private synchronized static Map<Integer,User> getCurrentDataMap(){
Map<Integer,User> emailTrackHashMap = new HashMap<Integer,User>(256);
emailTrackHashMap.putAll(concurrentMap);
//将 EMAIL_TRACK_MAP 清空
clearMap();
//返回添加了 EMAIL_TRACK_MAP 请空前所有数据的Map
// 以便将 EMAIL_TRACK_MAP 释放,可以重新添加元素,而旧的元素在Map中慢慢更新
return emailTrackHashMap;
}
}
class User implements Serializable{
private Integer id;
private Integer money;
/**
* 一般涉及安全性的属性,不序列化,使用 transient
* 序列化除了 Serializable(自动序列化)
* 还有 implements Externalizable ( 手动序列化writeExternal()方法实现; transient对该方式无效 )
*/
private transient Integer password;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getMoney() {
return money;
}
public void setMoney(Integer money) {
this.money = money;
}
public Integer getPassword() {
return password;
}
public void setPassword(Integer password) {
this.password = password;
}
}
并发成员变量实际方案-类锁
最新推荐文章于 2022-12-25 18:52:15 发布