微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

整数值同步

如何解决整数值同步

我是多线程技术的新手,使用相同类型的代码会遇到一些问题。

我有以下代码要基于整数值锁定。

Integer key = mmybatisMapper.getkeyByUserName(userName);  /// database call using mybatis to get key    
PostProcessingTask postProcessingTask = new PostProcessingTask(key,userName);
Thread thread = new Thread(postProcessingTask);
thread.start();
        

//后处理代码

public class PostProcessingTask implements Runnable {

    private final Integer key;
    private final Integer name;

    private ConcurrentMap<Integer,Integer> locks = new ConcurrentHashMap<Integer,Integer>();

    public PostProcessingTask(final Integer key,final Integer name) {
        this.key = key;
        this.name = name;
        locks.put(key,key);
    }

    @Override
    public void run() {
        try {
            synchronized (locks.get(this.key)) {    
                    ///business logic
            }           
                
        }
    }   
}

上面的代码可以很好地实现基于Integer值的同步。

但是,现在我再次尝试基于Integer值在另一个项目中实现同步,但该同步不起作用。 上面的代码和新的项目代码间的唯一区别是,上面的代码是使用MyBatis从数据库获取Integer值,而我的新代码将使用来自REST端点请求的Integer值。

您能帮我解决基于REST端点请求中的值进行同步的问题吗?

解决方法

synchronized值进行Integer是一个非常糟糕的主意,因为Integer.valueOf对于[-128,127]以外的整数具有不同的行为,并且完全无关的代码位可能会同步在上面。在Integer值上进行同步可能会发生不可预测的怪异事情。

不过,有一种简单的方法可以修改代码以完成您要执行的操作,那就是使用只是一个完全没有意义的Object 进行同步。编写locks.put(key,new Object()),并保持其余代码不变。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。