java原子类AtomicInteger自增结果值重复的问题

shenlongshi 2018-10-17 04:40:04
目的:验证多线程下AtomicInteger自增原子操作
期望结果:tomicInteger的值是从1到100
问题:当前存在的问题是多个线程执行后,结果存在重复的现象,请求有人能给出错误原因的分析吗?个人看不出来。谢谢。

附件代码和结果截图:
代码:

public class C14Test {

public static void main(String[] args) {

AtomicInteger atomicInteger = new AtomicInteger(0);

for (int i = 0; i < 100; i++) {

Thread threadAtomic = new Thread(new ThAtomic(atomicInteger));
threadAtomic.start();
}


}

}



class ThAtomic implements Runnable{

AtomicInteger atomicInteger;
//Lock lock;
public ThAtomic(AtomicInteger atomicInteger){
this.atomicInteger = atomicInteger;
//this.lock = new ReentrantLock();
}

@Override public void run() {
try{
//lock.lock();
atomicInteger.incrementAndGet();
System.out.println("当前线程是:"+Thread.currentThread()+" count="+atomicInteger.get());
}finally {
//lock.unlock();
}

}
}



结果:
当前线程是:Thread[Thread-0,5,main] count=1
当前线程是:Thread[Thread-1,5,main] count=2
当前线程是:Thread[Thread-2,5,main] count=3
当前线程是:Thread[Thread-3,5,main] count=4
当前线程是:Thread[Thread-4,5,main] count=5
当前线程是:Thread[Thread-6,5,main] count=7
当前线程是:Thread[Thread-5,5,main] count=6
当前线程是:Thread[Thread-7,5,main] count=8
当前线程是:Thread[Thread-8,5,main] count=9
当前线程是:Thread[Thread-11,5,main] count=11
当前线程是:Thread[Thread-9,5,main] count=12
当前线程是:Thread[Thread-10,5,main] count=11
当前线程是:Thread[Thread-12,5,main] count=14
当前线程是:Thread[Thread-14,5,main] count=15
当前线程是:Thread[Thread-13,5,main] count=15
当前线程是:Thread[Thread-16,5,main] count=16
当前线程是:Thread[Thread-15,5,main] count=17
当前线程是:Thread[Thread-20,5,main] count=20
当前线程是:Thread[Thread-17,5,main] count=21
当前线程是:Thread[Thread-19,5,main] count=21
当前线程是:Thread[Thread-18,5,main] count=20
当前线程是:Thread[Thread-22,5,main] count=24
当前线程是:Thread[Thread-23,5,main] count=24
当前线程是:Thread[Thread-21,5,main] count=24
当前线程是:Thread[Thread-24,5,main] count=25
当前线程是:Thread[Thread-25,5,main] count=27
当前线程是:Thread[Thread-26,5,main] count=27
当前线程是:Thread[Thread-27,5,main] count=29
当前线程是:Thread[Thread-28,5,main] count=29
当前线程是:Thread[Thread-30,5,main] count=30
当前线程是:Thread[Thread-32,5,main] count=33
当前线程是:Thread[Thread-29,5,main] count=33
当前线程是:Thread[Thread-31,5,main] count=33
当前线程是:Thread[Thread-33,5,main] count=34
当前线程是:Thread[Thread-34,5,main] count=35
当前线程是:Thread[Thread-36,5,main] count=36
当前线程是:Thread[Thread-35,5,main] count=37
当前线程是:Thread[Thread-37,5,main] count=38
当前线程是:Thread[Thread-38,5,main] count=39
当前线程是:Thread[Thread-40,5,main] count=41
当前线程是:Thread[Thread-41,5,main] count=43
当前线程是:Thread[Thread-42,5,main] count=43
当前线程是:Thread[Thread-39,5,main] count=41
当前线程是:Thread[Thread-43,5,main] count=44
当前线程是:Thread[Thread-44,5,main] count=46
当前线程是:Thread[Thread-45,5,main] count=46
当前线程是:Thread[Thread-46,5,main] count=48
当前线程是:Thread[Thread-48,5,main] count=49
当前线程是:Thread[Thread-47,5,main] count=49
当前线程是:Thread[Thread-49,5,main] count=50
当前线程是:Thread[Thread-50,5,main] count=51
当前线程是:Thread[Thread-51,5,main] count=52
当前线程是:Thread[Thread-52,5,main] count=55
当前线程是:Thread[Thread-56,5,main] count=56
当前线程是:Thread[Thread-54,5,main] count=56
当前线程是:Thread[Thread-55,5,main] count=56
当前线程是:Thread[Thread-58,5,main] count=59
当前线程是:Thread[Thread-57,5,main] count=58
当前线程是:Thread[Thread-53,5,main] count=57
当前线程是:Thread[Thread-62,5,main] count=62
当前线程是:Thread[Thread-60,5,main] count=63
当前线程是:Thread[Thread-59,5,main] count=62
当前线程是:Thread[Thread-63,5,main] count=63
当前线程是:Thread[Thread-64,5,main] count=65
当前线程是:Thread[Thread-61,5,main] count=65
当前线程是:Thread[Thread-65,5,main] count=66
当前线程是:Thread[Thread-67,5,main] count=67
当前线程是:Thread[Thread-68,5,main] count=68
当前线程是:Thread[Thread-66,5,main] count=69
当前线程是:Thread[Thread-70,5,main] count=70
当前线程是:Thread[Thread-72,5,main] count=72
当前线程是:Thread[Thread-71,5,main] count=72
当前线程是:Thread[Thread-73,5,main] count=73
当前线程是:Thread[Thread-69,5,main] count=74
当前线程是:Thread[Thread-74,5,main] count=75
当前线程是:Thread[Thread-75,5,main] count=76
当前线程是:Thread[Thread-76,5,main] count=77
当前线程是:Thread[Thread-77,5,main] count=78
当前线程是:Thread[Thread-78,5,main] count=79
当前线程是:Thread[Thread-80,5,main] count=80
当前线程是:Thread[Thread-81,5,main] count=82
当前线程是:Thread[Thread-79,5,main] count=82
当前线程是:Thread[Thread-84,5,main] count=84
当前线程是:Thread[Thread-85,5,main] count=86
当前线程是:Thread[Thread-82,5,main] count=85
当前线程是:Thread[Thread-83,5,main] count=84
当前线程是:Thread[Thread-86,5,main] count=87
当前线程是:Thread[Thread-88,5,main] count=89
当前线程是:Thread[Thread-90,5,main] count=90
当前线程是:Thread[Thread-87,5,main] count=89
当前线程是:Thread[Thread-89,5,main] count=93
当前线程是:Thread[Thread-92,5,main] count=92
当前线程是:Thread[Thread-91,5,main] count=91
当前线程是:Thread[Thread-94,5,main] count=94
当前线程是:Thread[Thread-98,5,main] count=95
当前线程是:Thread[Thread-93,5,main] count=97
当前线程是:Thread[Thread-97,5,main] count=100
当前线程是:Thread[Thread-99,5,main] count=99
当前线程是:Thread[Thread-95,5,main] count=99
当前线程是:Thread[Thread-96,5,main] count=97

Process finished with exit code 0

...全文
1412 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cui544564050 2020-09-02
  • 打赏
  • 举报
回复
Set<Integer> set = new HashSet<>(); set都不是线程安全的集合怎么可能是1000
yuxiangcai2008 2019-08-09
  • 打赏
  • 举报
回复
这个原因很清楚啊 System.out.println 的时候 被另一个线程加1了呗 比如原始是10 线程1加以后变成11,而在它执行System.out.println的时候,另一个线程2已经把这个数又加一了,然后这个System.out.println 就打印了12, 而线程2同时也打印了12,就变成两个12了呗。 而AtomicInteger的value是volatile类型的对所有线程可见 如果还有其他问题欢迎追问。
  • 打赏
  • 举报
回复
解决方案一,每次new一个对象,不也是不同的锁吗
weixin_39560566 2018-12-26
  • 打赏
  • 举报
回复
解决方案一还是有问题的
Set<Integer> set = new HashSet<>();
AtomicInteger ai = new AtomicInteger(0);
ExecutorService es = Executors.newCachedThreadPool();
for (int i=0; i<100000; i++){
es.submit(() -> {
int ss=ai.incrementAndGet();
set.add(ss);
// System.out.println("当前线程是:"+Thread.currentThread()+" count="+ss);
});
}

es.shutdown();
while (!es.isTerminated()) {
}

System.out.println(set.size());
最好输出set.size()不足100000证明有重复的
shenlongshi 2018-10-17
  • 打赏
  • 举报
回复
解决方案二运行结果:
当前线程是:Thread[Thread-5,5,main]
当前线程是:Thread[Thread-5,5,main] atomicInteger.get() count=1
当前线程是:Thread[Thread-7,5,main]
当前线程是:Thread[Thread-7,5,main] atomicInteger.get() count=2
当前线程是:Thread[Thread-8,5,main]
当前线程是:Thread[Thread-8,5,main] atomicInteger.get() count=3
当前线程是:Thread[Thread-2,5,main]
当前线程是:Thread[Thread-2,5,main] atomicInteger.get() count=4
当前线程是:Thread[Thread-9,5,main]
当前线程是:Thread[Thread-9,5,main] atomicInteger.get() count=5
当前线程是:Thread[Thread-11,5,main]
当前线程是:Thread[Thread-11,5,main] atomicInteger.get() count=6
当前线程是:Thread[Thread-12,5,main]
当前线程是:Thread[Thread-12,5,main] atomicInteger.get() count=7
当前线程是:Thread[Thread-4,5,main]
当前线程是:Thread[Thread-4,5,main] atomicInteger.get() count=8
当前线程是:Thread[Thread-3,5,main]
当前线程是:Thread[Thread-3,5,main] atomicInteger.get() count=9
当前线程是:Thread[Thread-1,5,main]
当前线程是:Thread[Thread-1,5,main] atomicInteger.get() count=10
当前线程是:Thread[Thread-0,5,main]
当前线程是:Thread[Thread-0,5,main] atomicInteger.get() count=11
当前线程是:Thread[Thread-6,5,main]
当前线程是:Thread[Thread-6,5,main] atomicInteger.get() count=12
当前线程是:Thread[Thread-10,5,main]
当前线程是:Thread[Thread-10,5,main] atomicInteger.get() count=13
当前线程是:Thread[Thread-21,5,main]
当前线程是:Thread[Thread-21,5,main] atomicInteger.get() count=14
当前线程是:Thread[Thread-23,5,main]
当前线程是:Thread[Thread-23,5,main] atomicInteger.get() count=15
当前线程是:Thread[Thread-14,5,main]
当前线程是:Thread[Thread-14,5,main] atomicInteger.get() count=16
当前线程是:Thread[Thread-13,5,main]
当前线程是:Thread[Thread-13,5,main] atomicInteger.get() count=17
当前线程是:Thread[Thread-29,5,main]
当前线程是:Thread[Thread-29,5,main] atomicInteger.get() count=18
当前线程是:Thread[Thread-15,5,main]
当前线程是:Thread[Thread-15,5,main] atomicInteger.get() count=19
当前线程是:Thread[Thread-31,5,main]
当前线程是:Thread[Thread-31,5,main] atomicInteger.get() count=20
当前线程是:Thread[Thread-16,5,main]
当前线程是:Thread[Thread-16,5,main] atomicInteger.get() count=21
当前线程是:Thread[Thread-17,5,main]
当前线程是:Thread[Thread-17,5,main] atomicInteger.get() count=22
当前线程是:Thread[Thread-18,5,main]
当前线程是:Thread[Thread-18,5,main] atomicInteger.get() count=23
当前线程是:Thread[Thread-36,5,main]
当前线程是:Thread[Thread-36,5,main] atomicInteger.get() count=24
当前线程是:Thread[Thread-19,5,main]
当前线程是:Thread[Thread-19,5,main] atomicInteger.get() count=25
当前线程是:Thread[Thread-41,5,main]
当前线程是:Thread[Thread-41,5,main] atomicInteger.get() count=26
当前线程是:Thread[Thread-20,5,main]
当前线程是:Thread[Thread-20,5,main] atomicInteger.get() count=27
当前线程是:Thread[Thread-22,5,main]
当前线程是:Thread[Thread-22,5,main] atomicInteger.get() count=28
当前线程是:Thread[Thread-24,5,main]
当前线程是:Thread[Thread-24,5,main] atomicInteger.get() count=29
当前线程是:Thread[Thread-25,5,main]
当前线程是:Thread[Thread-25,5,main] atomicInteger.get() count=30
当前线程是:Thread[Thread-26,5,main]
当前线程是:Thread[Thread-26,5,main] atomicInteger.get() count=31
当前线程是:Thread[Thread-27,5,main]
当前线程是:Thread[Thread-27,5,main] atomicInteger.get() count=32
当前线程是:Thread[Thread-50,5,main]
当前线程是:Thread[Thread-50,5,main] atomicInteger.get() count=33
当前线程是:Thread[Thread-53,5,main]
当前线程是:Thread[Thread-53,5,main] atomicInteger.get() count=34
当前线程是:Thread[Thread-28,5,main]
当前线程是:Thread[Thread-28,5,main] atomicInteger.get() count=35
当前线程是:Thread[Thread-30,5,main]
当前线程是:Thread[Thread-30,5,main] atomicInteger.get() count=36
当前线程是:Thread[Thread-33,5,main]
当前线程是:Thread[Thread-33,5,main] atomicInteger.get() count=37
当前线程是:Thread[Thread-34,5,main]
当前线程是:Thread[Thread-34,5,main] atomicInteger.get() count=38
当前线程是:Thread[Thread-35,5,main]
当前线程是:Thread[Thread-35,5,main] atomicInteger.get() count=39
当前线程是:Thread[Thread-63,5,main]
当前线程是:Thread[Thread-63,5,main] atomicInteger.get() count=40
当前线程是:Thread[Thread-64,5,main]
当前线程是:Thread[Thread-64,5,main] atomicInteger.get() count=41
当前线程是:Thread[Thread-39,5,main]
当前线程是:Thread[Thread-39,5,main] atomicInteger.get() count=42
当前线程是:Thread[Thread-66,5,main]
当前线程是:Thread[Thread-66,5,main] atomicInteger.get() count=43
当前线程是:Thread[Thread-67,5,main]
当前线程是:Thread[Thread-67,5,main] atomicInteger.get() count=44
当前线程是:Thread[Thread-68,5,main]
当前线程是:Thread[Thread-68,5,main] atomicInteger.get() count=45
当前线程是:Thread[Thread-37,5,main]
当前线程是:Thread[Thread-37,5,main] atomicInteger.get() count=46
当前线程是:Thread[Thread-72,5,main]
当前线程是:Thread[Thread-72,5,main] atomicInteger.get() count=47
当前线程是:Thread[Thread-38,5,main]
当前线程是:Thread[Thread-38,5,main] atomicInteger.get() count=48
当前线程是:Thread[Thread-32,5,main]
当前线程是:Thread[Thread-32,5,main] atomicInteger.get() count=49
当前线程是:Thread[Thread-75,5,main]
当前线程是:Thread[Thread-75,5,main] atomicInteger.get() count=50
当前线程是:Thread[Thread-40,5,main]
当前线程是:Thread[Thread-40,5,main] atomicInteger.get() count=51
当前线程是:Thread[Thread-77,5,main]
当前线程是:Thread[Thread-77,5,main] atomicInteger.get() count=52
当前线程是:Thread[Thread-80,5,main]
当前线程是:Thread[Thread-80,5,main] atomicInteger.get() count=53
当前线程是:Thread[Thread-81,5,main]
当前线程是:Thread[Thread-81,5,main] atomicInteger.get() count=54
当前线程是:Thread[Thread-42,5,main]
当前线程是:Thread[Thread-42,5,main] atomicInteger.get() count=55
当前线程是:Thread[Thread-82,5,main]
当前线程是:Thread[Thread-82,5,main] atomicInteger.get() count=56
当前线程是:Thread[Thread-43,5,main]
当前线程是:Thread[Thread-43,5,main] atomicInteger.get() count=57
当前线程是:Thread[Thread-84,5,main]
当前线程是:Thread[Thread-84,5,main] atomicInteger.get() count=58
当前线程是:Thread[Thread-85,5,main]
当前线程是:Thread[Thread-85,5,main] atomicInteger.get() count=59
当前线程是:Thread[Thread-44,5,main]
当前线程是:Thread[Thread-44,5,main] atomicInteger.get() count=60
当前线程是:Thread[Thread-86,5,main]
当前线程是:Thread[Thread-86,5,main] atomicInteger.get() count=61
当前线程是:Thread[Thread-88,5,main]
当前线程是:Thread[Thread-88,5,main] atomicInteger.get() count=62
当前线程是:Thread[Thread-45,5,main]
当前线程是:Thread[Thread-45,5,main] atomicInteger.get() count=63
当前线程是:Thread[Thread-46,5,main]
当前线程是:Thread[Thread-46,5,main] atomicInteger.get() count=64
当前线程是:Thread[Thread-47,5,main]
当前线程是:Thread[Thread-47,5,main] atomicInteger.get() count=65
当前线程是:Thread[Thread-48,5,main]
当前线程是:Thread[Thread-48,5,main] atomicInteger.get() count=66
当前线程是:Thread[Thread-49,5,main]
当前线程是:Thread[Thread-49,5,main] atomicInteger.get() count=67
当前线程是:Thread[Thread-51,5,main]
当前线程是:Thread[Thread-51,5,main] atomicInteger.get() count=68
当前线程是:Thread[Thread-52,5,main]
当前线程是:Thread[Thread-52,5,main] atomicInteger.get() count=69
当前线程是:Thread[Thread-54,5,main]
当前线程是:Thread[Thread-54,5,main] atomicInteger.get() count=70
当前线程是:Thread[Thread-55,5,main]
当前线程是:Thread[Thread-55,5,main] atomicInteger.get() count=71
当前线程是:Thread[Thread-56,5,main]
当前线程是:Thread[Thread-56,5,main] atomicInteger.get() count=72
当前线程是:Thread[Thread-57,5,main]
当前线程是:Thread[Thread-57,5,main] atomicInteger.get() count=73
当前线程是:Thread[Thread-60,5,main]
当前线程是:Thread[Thread-60,5,main] atomicInteger.get() count=74
当前线程是:Thread[Thread-58,5,main]
当前线程是:Thread[Thread-58,5,main] atomicInteger.get() count=75
当前线程是:Thread[Thread-59,5,main]
当前线程是:Thread[Thread-59,5,main] atomicInteger.get() count=76
当前线程是:Thread[Thread-61,5,main]
当前线程是:Thread[Thread-61,5,main] atomicInteger.get() count=77
当前线程是:Thread[Thread-62,5,main]
当前线程是:Thread[Thread-62,5,main] atomicInteger.get() count=78
当前线程是:Thread[Thread-65,5,main]
当前线程是:Thread[Thread-65,5,main] atomicInteger.get() count=79
当前线程是:Thread[Thread-69,5,main]
当前线程是:Thread[Thread-69,5,main] atomicInteger.get() count=80
当前线程是:Thread[Thread-70,5,main]
当前线程是:Thread[Thread-70,5,main] atomicInteger.get() count=81
当前线程是:Thread[Thread-71,5,main]
当前线程是:Thread[Thread-71,5,main] atomicInteger.get() count=82
当前线程是:Thread[Thread-73,5,main]
当前线程是:Thread[Thread-73,5,main] atomicInteger.get() count=83
当前线程是:Thread[Thread-74,5,main]
当前线程是:Thread[Thread-74,5,main] atomicInteger.get() count=84
当前线程是:Thread[Thread-76,5,main]
当前线程是:Thread[Thread-76,5,main] atomicInteger.get() count=85
当前线程是:Thread[Thread-78,5,main]
当前线程是:Thread[Thread-78,5,main] atomicInteger.get() count=86
当前线程是:Thread[Thread-79,5,main]
当前线程是:Thread[Thread-79,5,main] atomicInteger.get() count=87
当前线程是:Thread[Thread-83,5,main]
当前线程是:Thread[Thread-83,5,main] atomicInteger.get() count=88
当前线程是:Thread[Thread-87,5,main]
当前线程是:Thread[Thread-87,5,main] atomicInteger.get() count=89
当前线程是:Thread[Thread-89,5,main]
当前线程是:Thread[Thread-89,5,main] atomicInteger.get() count=90
当前线程是:Thread[Thread-93,5,main]
当前线程是:Thread[Thread-93,5,main] atomicInteger.get() count=91
当前线程是:Thread[Thread-90,5,main]
当前线程是:Thread[Thread-90,5,main] atomicInteger.get() count=92
当前线程是:Thread[Thread-91,5,main]
当前线程是:Thread[Thread-91,5,main] atomicInteger.get() count=93
当前线程是:Thread[Thread-92,5,main]
当前线程是:Thread[Thread-92,5,main] atomicInteger.get() count=94
当前线程是:Thread[Thread-96,5,main]
当前线程是:Thread[Thread-96,5,main] atomicInteger.get() count=95
当前线程是:Thread[Thread-95,5,main]
当前线程是:Thread[Thread-95,5,main] atomicInteger.get() count=96
当前线程是:Thread[Thread-94,5,main]
当前线程是:Thread[Thread-94,5,main] atomicInteger.get() count=97
当前线程是:Thread[Thread-97,5,main]
当前线程是:Thread[Thread-97,5,main] atomicInteger.get() count=98
当前线程是:Thread[Thread-98,5,main]
当前线程是:Thread[Thread-98,5,main] atomicInteger.get() count=99
当前线程是:Thread[Thread-99,5,main]
当前线程是:Thread[Thread-99,5,main] atomicInteger.get() count=100

Process finished with exit code 0
shenlongshi 2018-10-17
  • 打赏
  • 举报
回复
解决方案二:


public class LockClass {

AtomicInteger atomicInteger;
Lock lock;

public LockClass(AtomicInteger atomicInteger, ReentrantLock lock) {
this.lock = lock;
this.atomicInteger = atomicInteger;
}
public void operation() {

try {
lock.lock();
System.out.println("当前线程是:" + Thread.currentThread());
int value = atomicInteger.incrementAndGet();
//System.out.println("当前线程是:" + Thread.currentThread() + " value count=" + value);
System.out.println("当前线程是:" + Thread.currentThread() + " atomicInteger.get() count=" + atomicInteger
.get());//用这个取值,不能保证取出来的是当前线程更新的值,有可能在当前线程执行更新后,被其他线程抢占执行情况,导致atomicInteger
//.get()在其他线程更新atomicInteger后,才继续执行并取出来其他线程更新过后的值。需要不同的线程使用一个相同的锁将这两名语句锁住,才可以实现正确的输出。
} finally {
lock.unlock();
}
}
}



public class TestLockCurrent {

public static void main(String[] args) {

AtomicInteger atomicInteger = new AtomicInteger(0);
ReentrantLock reentrantLock = new ReentrantLock();//此处保证了所有的线程使用了一个相同的锁。
for (int i = 0; i < 100; i++) {
Runnable r = () -> {
new LockClass(atomicInteger,reentrantLock).operation();
};

Thread t = new Thread(r);
t.start();
}

}
}


shenlongshi 2018-10-17
  • 打赏
  • 举报
回复
此问题已经解决。主要的原因是出现ThAtomic的run()方法中atomicInteger.incrementAndGet()和System.out.println("当前线程是:"+Thread.currentThread()+" count="+atomicInteger.get());这两个语句的执行中间有可能被中断(被其他线程抢占CPU资源)。如果使用锁将这两个语句加锁是可以正常输出的。但我注释掉的锁不起作用是因为,锁在初始化在构造方法中初始化,导致每一个线程都有一个单独的锁,无法直到锁的作用。改为使用一个相同的锁就可以解决了。

解决方案一:

public class C14Test {

public static void main(String[] args) {

AtomicInteger atomicInteger = new AtomicInteger(0);

for (int i = 0; i < 100; i++) {

Thread threadAtomic = new Thread(new ThAtomic(atomicInteger));
threadAtomic.start();
}

}

}

class ThAtomic implements Runnable {


AtomicInteger atomicInteger;

Lock lock;
public ThAtomic(AtomicInteger atomicInteger) {
this.atomicInteger = atomicInteger;
this.lock = new ReentrantLock();
}
@Override public void run() {

try {
//lock.lock();//这里之所以锁不管用,是因为每个线程全程的锁都是一个新的不一样的锁,在本构造方法上创建的,所以实际上是没有起到锁的作用的。
//将锁换成一个,就可以实现tomicInteger.get()获取到正确的值了。
int value = atomicInteger.incrementAndGet();
System.out.println("当前线程是:" + Thread.currentThread() + " value count=" + value);
//System.out.println("当前线程是:" + Thread.currentThread() + " atomicInteger.get() count=" + atomicInteger
// .get());//用这个取值,不能保证取出来的是当前线程更新的值,有可能在当前线程执行更新后,被其他线程抢占执行情况,导致atomicInteger
//.get()在其他线程更新atomicInteger后,才继续执行并取出来其他线程更新过后的值。
} finally {
//lock.unlock();
}
}


}


运行结果:
/opt/java1.8/jdk1.8.0_162/bin/java -javaagent:/opt/idea-IU-173.4674.33/lib/idea_rt.jar=33393:/opt/idea-IU-173.4674.33/bin -Dfile.encoding=UTF-8 -classpath /opt/java1.8/jdk1.8.0_162/jre/lib/charsets.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/deploy.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/cldrdata.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/dnsns.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/jaccess.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/jfxrt.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/localedata.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/nashorn.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/sunec.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/sunjce_provider.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/sunpkcs11.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/ext/zipfs.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/javaws.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/jce.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/jfr.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/jfxswt.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/jsse.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/management-agent.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/plugin.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/resources.jar:/opt/java1.8/jdk1.8.0_162/jre/lib/rt.jar:/home/sossos/Projects/JavaTest/out/production/JavaTest C14Test
当前线程是:Thread[Thread-0,5,main] value count=1
当前线程是:Thread[Thread-1,5,main] value count=2
当前线程是:Thread[Thread-2,5,main] value count=3
当前线程是:Thread[Thread-3,5,main] value count=4
当前线程是:Thread[Thread-4,5,main] value count=5
当前线程是:Thread[Thread-5,5,main] value count=6
当前线程是:Thread[Thread-6,5,main] value count=7
当前线程是:Thread[Thread-7,5,main] value count=8
当前线程是:Thread[Thread-8,5,main] value count=9
当前线程是:Thread[Thread-9,5,main] value count=11
当前线程是:Thread[Thread-10,5,main] value count=10
当前线程是:Thread[Thread-12,5,main] value count=13
当前线程是:Thread[Thread-11,5,main] value count=12
当前线程是:Thread[Thread-13,5,main] value count=14
当前线程是:Thread[Thread-16,5,main] value count=16
当前线程是:Thread[Thread-15,5,main] value count=17
当前线程是:Thread[Thread-14,5,main] value count=15
当前线程是:Thread[Thread-17,5,main] value count=18
当前线程是:Thread[Thread-18,5,main] value count=20
当前线程是:Thread[Thread-19,5,main] value count=19
当前线程是:Thread[Thread-20,5,main] value count=21
当前线程是:Thread[Thread-21,5,main] value count=22
当前线程是:Thread[Thread-22,5,main] value count=23
当前线程是:Thread[Thread-23,5,main] value count=24
当前线程是:Thread[Thread-24,5,main] value count=25
当前线程是:Thread[Thread-25,5,main] value count=26
当前线程是:Thread[Thread-26,5,main] value count=30
当前线程是:Thread[Thread-27,5,main] value count=27
当前线程是:Thread[Thread-28,5,main] value count=28
当前线程是:Thread[Thread-29,5,main] value count=29
当前线程是:Thread[Thread-31,5,main] value count=31
当前线程是:Thread[Thread-32,5,main] value count=32
当前线程是:Thread[Thread-33,5,main] value count=33
当前线程是:Thread[Thread-30,5,main] value count=34
当前线程是:Thread[Thread-34,5,main] value count=35
当前线程是:Thread[Thread-37,5,main] value count=38
当前线程是:Thread[Thread-38,5,main] value count=39
当前线程是:Thread[Thread-36,5,main] value count=37
当前线程是:Thread[Thread-35,5,main] value count=36
当前线程是:Thread[Thread-40,5,main] value count=41
当前线程是:Thread[Thread-39,5,main] value count=40
当前线程是:Thread[Thread-48,5,main] value count=49
当前线程是:Thread[Thread-47,5,main] value count=48
当前线程是:Thread[Thread-46,5,main] value count=47
当前线程是:Thread[Thread-41,5,main] value count=46
当前线程是:Thread[Thread-45,5,main] value count=45
当前线程是:Thread[Thread-42,5,main] value count=42
当前线程是:Thread[Thread-43,5,main] value count=43
当前线程是:Thread[Thread-44,5,main] value count=44
当前线程是:Thread[Thread-51,5,main] value count=52
当前线程是:Thread[Thread-52,5,main] value count=53
当前线程是:Thread[Thread-50,5,main] value count=51
当前线程是:Thread[Thread-49,5,main] value count=50
当前线程是:Thread[Thread-53,5,main] value count=54
当前线程是:Thread[Thread-54,5,main] value count=55
当前线程是:Thread[Thread-55,5,main] value count=56
当前线程是:Thread[Thread-56,5,main] value count=57
当前线程是:Thread[Thread-57,5,main] value count=58
当前线程是:Thread[Thread-60,5,main] value count=61
当前线程是:Thread[Thread-59,5,main] value count=59
当前线程是:Thread[Thread-58,5,main] value count=60
当前线程是:Thread[Thread-61,5,main] value count=62
当前线程是:Thread[Thread-62,5,main] value count=63
当前线程是:Thread[Thread-63,5,main] value count=64
当前线程是:Thread[Thread-65,5,main] value count=66
当前线程是:Thread[Thread-66,5,main] value count=67
当前线程是:Thread[Thread-64,5,main] value count=65
当前线程是:Thread[Thread-70,5,main] value count=68
当前线程是:Thread[Thread-69,5,main] value count=69
当前线程是:Thread[Thread-72,5,main] value count=70
当前线程是:Thread[Thread-71,5,main] value count=71
当前线程是:Thread[Thread-73,5,main] value count=72
当前线程是:Thread[Thread-67,5,main] value count=74
当前线程是:Thread[Thread-76,5,main] value count=75
当前线程是:Thread[Thread-68,5,main] value count=73
当前线程是:Thread[Thread-78,5,main] value count=76
当前线程是:Thread[Thread-79,5,main] value count=80
当前线程是:Thread[Thread-83,5,main] value count=79
当前线程是:Thread[Thread-80,5,main] value count=78
当前线程是:Thread[Thread-84,5,main] value count=77
当前线程是:Thread[Thread-82,5,main] value count=81
当前线程是:Thread[Thread-81,5,main] value count=82
当前线程是:Thread[Thread-74,5,main] value count=83
当前线程是:Thread[Thread-77,5,main] value count=84
当前线程是:Thread[Thread-85,5,main] value count=86
当前线程是:Thread[Thread-87,5,main] value count=88
当前线程是:Thread[Thread-86,5,main] value count=85
当前线程是:Thread[Thread-88,5,main] value count=87
当前线程是:Thread[Thread-75,5,main] value count=89
当前线程是:Thread[Thread-90,5,main] value count=92
当前线程是:Thread[Thread-92,5,main] value count=93
当前线程是:Thread[Thread-93,5,main] value count=94
当前线程是:Thread[Thread-96,5,main] value count=97
当前线程是:Thread[Thread-91,5,main] value count=91
当前线程是:Thread[Thread-89,5,main] value count=90
当前线程是:Thread[Thread-95,5,main] value count=96
当前线程是:Thread[Thread-94,5,main] value count=95
当前线程是:Thread[Thread-98,5,main] value count=99
当前线程是:Thread[Thread-99,5,main] value count=100
当前线程是:Thread[Thread-97,5,main] value count=98

Process finished with exit code 0


夏天已过217 2021-08-05
  • 举报
回复
@shenlongshi incrementAndGet 才是原子操作 你用该用的是这个方法的返回值 重新atomicInteger.get()干啥哦 这不是二次取值?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧