【问题标题】:Integer value synchronization [closed]整数值同步
【发布时间】:2020-10-19 18:59:02
【问题描述】:

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

我有以下代码可以根据整数值锁定。

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

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

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

您能帮我解决根据来自 REST 端点请求的值进行同步的问题吗?

【问题讨论】:

  • “它不工作” - 什么不工作?你预期会发生什么,而发生了什么?另外,发布工作的代码,而不是工作的代码,以获得调试帮助。

标签: java multithreading synchronization synchronized


【解决方案1】:

Integer 值执行synchronized 是一个非常糟糕的主意,因为Integer.valueOf 对于[-128, 127] 之外的整数具有不同的行为,并且完全不相关的代码位可能会在其上同步。在 Integer 值上进行同步可能会做出难以预料的奇怪事情。

不过,有一种简单的方法可以修改您的代码来做您想做的事情,那就是使用一个完全没有意义的Object 来代替同步。写locks.put(key, new Object()),其余代码保持不变。

【讨论】:

  • 不走运...我在两个地方做了更改 1-->private ConcurrentMap locks = new ConcurrentHashMap(); 2--> locks.put(key, new Object());
  • @sagar:发生了什么?生成的代码肯定更好,但不排除其他错误。例如,您可能希望共享ConcurrentMap,而不是为每个任务使用不同的ConcurrentMap,因为它始终只有一个条目。
  • 是的,代码更好......但是使用上述更改仍然无法实现同步......
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2022-12-06
  • 1970-01-01
  • 2015-11-10
  • 2021-10-23
相关资源
最近更新 更多