为什么同步不能同步线程?

JiexiSu

我已经设置了标志的值,但是结果不是'add'和'sub'交替出现。为什么?当我查看结果时,它执行了两次“ sub”方法。但是,当“ sub”方法结束时,标志的值将设置为“ false”。但是结果,它连续两次打印了“ subxxxxx”。

class Resource {
    private boolean flag = true;
    private int num = 0;

// At here I have declared an add()
    public synchronized void add() throws InterruptedException {
        if (this.flag == false) {
            super.wait();
        }
        Thread.sleep(100);
        this.num++;
        System.out.println("addition:"+Thread.currentThread().getName() + this.num);
        this.flag = false;
        super.notifyAll();
    }

// At here I have declared an sub()
    public synchronized void sub() throws InterruptedException {
        if (this.flag == true) {
            super.wait();
        }
        Thread.sleep(200);
        this.num--;
        System.out.println("subtraction:"+Thread.currentThread().getName() + this.num);
        this.flag = true;
        super.notifyAll();
    }
}

/*
* I will test it with multiple threads. For example:
*new Thread(ad, "add").start();
*new Thread(ad, "add").start();
*new Thread(sub, "sub").start();
*new Thread(sub, "sub").start();
*When threads start. it will execute alternately. For example:
Thread add:0
Thread sub:-1
Thread add:0
Thread sub:-1
Thread add:0
Thread sub:-1
Thread add:0
Thread sub:-1
But the result is like this:
Thread add:0
Thread sub:-1
Thread sub:-2
Thread add:-1
Thread sub:-3
Thread sub:-4
Why?Why?Why?
*/
        new Thread(ad, "add").start();
        new Thread(ad, "add").start();
        new Thread(sub, "sub").start();
        new Thread(sub, "sub").start();
    }
}
提洛

您似乎以为,当您的wait()通话结束时,该电话flag已更改为您要在致电之前拥有的电话wait()没有这样的保证,尤其是因为您涉及两个以上的线程。您应该检查是否需要继续等待。另请参见等待boolean值更改其状态

但是总的来说,这些结构太低了,无法使用(除非您想学习基本知识),并且您应该查看并发utils包,以获取更简单的高层结构(例如Queues,Latches,Conditions)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我必须同步线程的ArrayList?

来自分类Dev

为什么Thread.Sleep同步线程?

来自分类Dev

如果之间存在线程连接,为什么不能使用宽松的原子操作来同步内存?

来自分类Dev

同步线程方法正在同时执行-为什么?

来自分类Dev

为什么同步方法不适用于多线程

来自分类Dev

为什么线程仅以较大的间隔进行同步?

来自分类Dev

意图在android中是异步的。为什么不能同步呼叫?

来自分类Dev

为什么外部同步比内部同步快?

来自分类Dev

为什么外部同步比内部同步快?

来自分类Dev

线程同步?

来自分类Dev

线程同步

来自分类Dev

线程同步?

来自分类Dev

为什么同步SQL“不好”?

来自分类Dev

为什么不同步?

来自分类Dev

为什么在同步中等待?

来自分类Dev

为什么同步SQL“不好”?

来自分类Dev

为什么代码遵循同步?

来自分类Dev

为什么Java的HashTable是同步的?

来自分类Dev

在同步方法内部的线程中的同步块会发生什么?

来自分类Dev

多线程,线程同步

来自分类Dev

为什么未同步的对象比同步的对象性能更好?

来自分类Dev

为什么要同步一个同步列表?

来自分类Dev

为什么未同步的对象比同步的对象性能更好?

来自分类Dev

为什么要使用互斥锁而不是布尔变量进行线程同步?

来自分类Dev

为什么应该为一个线程同步resume和suspend方法?

来自分类Dev

Swift:线程安全的Singleton,为什么我们使用同步进行读取?

来自分类Dev

为什么不等待Task.Run()同步回UI线程/原始上下文?

来自分类Dev

为什么即使我的方法是同步的,我也要通过2个线程得到不同的结果?

来自分类Dev

为什么不同线程两次输入“同步(锁定)”?

Related 相关文章

热门标签

归档