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){
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);
clearMap();
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;
}
}