Java中多线程,synchronized,与 AtomicInteger的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中多线程,synchronized,与 AtomicInteger的问题相关的知识,希望对你有一定的参考价值。

多个线程对AtomicInteger 生成的值进行 类似++ 或 --的操作
是不是就不需要 synchronized 来保证数据的准确了。
我在参考一个其他人的Java程序
他使用了AtomicInteger
但是在对于AtomicInteger值操作的 getNextId()方法中, 依然是用来sync...来修饰。
这样合理吗?是不是属于资源的浪费

通过AtomicInteger来操作 是线程安全的 ,而且性能貌似远超 用synchronized的方法
因此不用加synchronized。确实是资源的浪费。
参考技术A 首先 :AtomicXXX,是J.C.U并发包下的类,用该类来代替普通的类,可以保证++/--操作是原子性的,也就是Atomic声明的类型,进行100次++,结果一定是增加100。普通int类型加100次,结果是<=100,这个就牵涉从CPU缓存取变量的数据过程中,N个java线程薝缓存之间变量没有可见性的原因。至于何谓‘可见性’,请参考《JAVA并发编程实践》或者《深入JAVA虚拟机》。
然后:你提到getNextId()上面加上sync,因为getNextId在JAVA层面来讲,是一个‘复合操作’(具体你可以看一下该方法的源码就明白了),在这个操作中会浪费一定的时间,你可以测试一下
method ()

syn(atomicNum)
Thread.sleep(1000);
return atomicNum.getNextId();




如果不用sync来获取atomicNum的锁定,很可能会出现线程不同步的问题。本回答被提问者采纳
参考技术B 当然需要同步,比如说,现在有一个初值为8的id,a和b两个都调用getNextId()方法,拿id的时候初值都为8,然后a和b都把自己的id++,就都是9,这样就会出错了,而id值也会出现错乱,追问

但是原子值AtomicInteger的存在意义不就是在不使用Sync下也可以多线程安全++ 或--吗

参考技术C 用volatile修饰属性即可。 参考技术D jutidian

以上是关于Java中多线程,synchronized,与 AtomicInteger的问题的主要内容,如果未能解决你的问题,请参考以下文章

Java中多线程等待通知示例中的线程连接(1)用法

java中多线程安全性和同步的常用方法

Java synchronized详解

java里多线程的wait问题

Java线程同步synchronized方法与方法块

java多线程核心技术——synchronized同步方法与synchronized同步快