【问题标题】:Java Synchronized (int) is possible?Java同步(int)是可能的吗?
【发布时间】:2018-04-29 02:05:06
【问题描述】:
class Banco{

    int slots;
    int []av;

    public Banco(int n){
        slots = n;
        av=new int[slots];
        for(int i=0;i<slots;i++)
            av[i]=0;

    }

    public int query(int i){
            return this.av[i];

    }

    public int getSlots (){
        return this.slots;
    }

    public synchronized void credito(int i, int valor){
        av[i] += valor;
    }

    public synchronized void debito(int i, int valor){
        av[i] -= valor;
    }

    public void transferir(int valor){
        Random r = new Random();

        int a = r.nextInt(slots);
        int b = r.nextInt(slots);

        if(a<b){
            synchronized(this.query(a)){
                synchronized(this.query(b)){
                    this.credito(b,valor);
                    this.debito(b,valor);
                }
            }
        }
        else{
            a = r.nextInt(slots);
            b = r.nextInt(slots);
        }

    }
}

这是我的代码,但在同步时出现以下错误,我不知道为什么:

意外的类型 同步(this.query(a))

必填:参考

找到:int

错误:意外类型 同步(this.query(b))

必填:参考

找到:int

【问题讨论】:

  • 不,不是。您无法在原语上进行同步。
  • 如错误消息所示,这是不可能的。它必须是Object
  • 好的,这是我的疑问,谢谢。
  • 你想做什么?这几乎可以肯定是XY Problem
  • @AndyTurner 我最喜欢query的实现 ;-)

标签: java synchronized


【解决方案1】:

您可以在 Integer 上同步,但不能在 int 上同步。我不明白为什么你会想要同步一个值。通常你会在一个专门为此目的而创建的对象上进行同步。

【讨论】:

    【解决方案2】:

    我需要详细说明@bruno 的回答。

    在 Java 中,所有非原始的东西都是Object 的子类。一个Integerint 周围的薄包装。它有一个值,您可以对其使用相同的基本算术。但它存在于堆上,几乎总是作为引用传递,而不是值的副本。如果您将int 替换为Integer,则同步将起作用。

    但是,最好考虑一下为什么要尝试同步 int 并考虑其他选项,例如 atomic operations 中的任何一个。一般来说,同步块的性能较差,虽然它们可以强制执行发生前的关系,但如果我们谈论的是单个整数,您通常不需要它。

    【讨论】:

      猜你喜欢
      • 2012-02-04
      • 2012-04-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 2017-09-25
      相关资源
      最近更新 更多