当前位置:  开发笔记 > 编程语言 > 正文

方法同步时需要波动?

如何解决《方法同步时需要波动?》经验,为你挑选了1个好方法。

我有多个线程访问class Aufzahlen和增加cc变量.我想知道我是不是把cc放在volatile上但我的同步方法是否有任何错误空间?由于cc变量一次只能访问一次.

线程是否仍然可以在自己的缓存中包含cc变量,因此它变得混乱?我一直在运行这段代码示例,到目前为止没有发现任何错误.

public class Aufzahlen {
private int cc=1;

  public synchronized void aufzahlen() throws InterruptedException {
    cc = cc +1;
  }


  public synchronized void printa() {
    // TODO Auto-generated method stub
    System.out.println("Thread: " + Thread.currentThread() + "Zahl: " + cc);
  }

{

RAnders00.. 6

1.可见性

这种方法不会失败.如果每次访问字段时都进行同步,则每次线程持有相同的锁时,都可以看到对它的更改,如下所示:

在此输入图像描述

来自Java Concurrency In Practice [ pdf ],图3.1

因此,使场不稳定是不必要的.通过使用具有相同目的AtomicIntegergetAndIncrement()incrementAndGet()方法可能会好得多,但具有更好的并发吞吐量(它们使用本机功能而不是锁定,它们专为完成此任务而设计) - 但要确保内存可见性AtomicInteger给出了它自己(最简单的方法就是让它最终 - 它不会让它AtomicInteger的价值最终).

public class Aufzahlen {
    private final AtomicInteger atomicInt = new AtomicInteger(1); // set initial value with constructor argument

    public void aufzahlen() {
        atomicInt.incrementAndGet();
    } // no need for synchronization because updates are atomic and are automatically visible
}
2.原子性

我可能在这篇文章中使用过一次或两次"原子",这意味着没有两个线程可能同时执行相同的代码,换句话说,操作不能"分成"多个部分,多个线程可能是同时在里面.

+--- Function aufzählen() without synchronization and with i++ ---------------+
|                                                                             |
| [Get i from field] --> [Increment i locally] --> [Write new value to field] |
|                     ^                         ^                             |
|                     |                         |                             |
|            "Race condition", multiple threads could be at these stages      |
|            -> operation not atomic                                          |
+-----------------------------------------------------------------------------+

我只是演示了什么不是原子的,你可以通过使用synchronized(下一个线程需要等待第一个完成整个方法)来使这个操作成为原子,或者你可以使用AtomicInteger哪个为你做这个原子性.



1> RAnders00..:
1.可见性

这种方法不会失败.如果每次访问字段时都进行同步,则每次线程持有相同的锁时,都可以看到对它的更改,如下所示:

在此输入图像描述

来自Java Concurrency In Practice [ pdf ],图3.1

因此,使场不稳定是不必要的.通过使用具有相同目的AtomicIntegergetAndIncrement()incrementAndGet()方法可能会好得多,但具有更好的并发吞吐量(它们使用本机功能而不是锁定,它们专为完成此任务而设计) - 但要确保内存可见性AtomicInteger给出了它自己(最简单的方法就是让它最终 - 它不会让它AtomicInteger的价值最终).

public class Aufzahlen {
    private final AtomicInteger atomicInt = new AtomicInteger(1); // set initial value with constructor argument

    public void aufzahlen() {
        atomicInt.incrementAndGet();
    } // no need for synchronization because updates are atomic and are automatically visible
}
2.原子性

我可能在这篇文章中使用过一次或两次"原子",这意味着没有两个线程可能同时执行相同的代码,换句话说,操作不能"分成"多个部分,多个线程可能是同时在里面.

+--- Function aufzählen() without synchronization and with i++ ---------------+
|                                                                             |
| [Get i from field] --> [Increment i locally] --> [Write new value to field] |
|                     ^                         ^                             |
|                     |                         |                             |
|            "Race condition", multiple threads could be at these stages      |
|            -> operation not atomic                                          |
+-----------------------------------------------------------------------------+

我只是演示了什么不是原子的,你可以通过使用synchronized(下一个线程需要等待第一个完成整个方法)来使这个操作成为原子,或者你可以使用AtomicInteger哪个为你做这个原子性.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有