当前位置: 首页 > 知识库问答 >
问题:

易失性和多线程同步不起作用[重复]

鲁永福
2023-03-14
public class VolatileDemo implements Runnable{

private static volatile int count = 0;
private Random random = new Random();

public static void main(String[] args) {
    for(int i=0;i<1000;i++){
        new Thread(new VolatileDemo()).start();
    }
    while(Thread.activeCount()>1){
        Thread.yield();
    }
    System.out.println(count);
}

@Override
public synchronized void run() {
    try {
        Thread.sleep(random.nextInt(1000));
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+" " + count++);
}

}

运行之后(在jdk1.8中),答案不是1000。请告诉我原因。

共有1个答案

仉伟兆
2023-03-14

对于增量操作,Volatile是不安全的,因为它不是原子的(读、增量、写)。Volatile只是保证对变量所做的更改对所有读取它的线程都是有效的。

对于安全的增量操作,应该使用“原子”变量

 类似资料:
  • 最近我在读一些关于java并发的书。关于线程安全,如果不可能使一个类变为inmutable,那么可以通过同步它的数据来确保线程安全。 下面的类显然不是线程安全的 然后我可以同步写,但它不会保持线程安全 因为我不仅需要同步写入,还需要同步读取 现在的问题是,通过使用易失性,我可以保证其他线程会看到更新的值,所以这让我认为这个类应该是线程安全的 最后一个类线程安全吗??

  • 问题内容: 我正在尝试同步三个线程以打印012012012012…。但是它不能正常工作。每个线程都分配有一个编号,当它从主线程接收到信号时将打印该编号。以下程序有问题,我无法捕获。 问题答案: 您需要更多的协调。该notify调用不会立即唤醒线程并强制其继续执行。相反,您可以考虑notify将电子邮件发送给线程以使其可以继续进行。想象一下,如果您想让3个朋友按顺序给您打电话。您向朋友1发送了一封电

  • 问题内容: 该练习直接由Kathy Seirra和Bert Bates撰写的SCJP 同步代码块 在本练习中,我们将尝试同步代码块。在该代码块中,我们将获得对对象的锁定,以便在代码块执行时其他线程无法修改它。我们将创建三个线程,它们都将尝试操纵同一对象。每个线程将输出一个字母100次,然后将该字母加1。我们将使用的对象是StringBuffer。 我们可以在String对象上进行同步,但是一旦创建

  • 问题内容: Oracle有关原子访问的文档(位于http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html)说: “一个易失性变量建立了一个事前发生的关系…。这意味着……当线程读取一个易失性变量时,它不仅看到了对易失性的最新更改,而且还看到了导致该代码的副作用改变。” 我无法解决这个问题。我了解volatile变

  • 我试图更好地理解Java多线程。所以,我知道这句话说只有一个线程可以访问一个对象实例,从而调用该实例的方法(例如,在这种情况下,类 中的减方法。 但是,当你仍然有相同的 会发生什么,但两个线程与不同的 相关联,完全试图调用 的方法?我以为不的消息永远不会被打印出来,但它确实打印出来了。毕竟,仍然只有一个对象实例 ,这是否意味着同步不适用于此示例?

  • 线程2:4 . . 线程3:7 线程3:8 线程1:9 这是我为正在执行线程的类编写的代码 我认为问题在于NumberEntry对象的创建。但我不太确定怎么修好它。如果有人能以任何方式帮助我,那就太好了:)。