并发成员变量实际方案-类锁

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;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值