扫码关注官方订阅号
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
AtomicInteger 的incrementAndGet 保证对整数的递增和获取是原子的,
值+1
返回值
一个线程在这两个操作之间不会强行插入另外的线程
你要保证顺序,那么需要的是线程互斥
你输出的右边不会重复也不会漏,这就是它的线程安全保证
AtomicInteger是一个原子类,顾名思义,它能保证一些操作是原子性的,比如说++、--等操作,这些操作在多线程的情况并不是线程安全的,但是使用原子类可以保证这些操作的原子性,从而来保证线程的安全性。
AtomicInteger
++、--
简单说说吧。
线程安全是在多线程环境下,数据的增加和减少是安全的,例子中数据不重复就代表了线程安全了。2.顺序问题是有线程执行的顺序决定的,和线程安全没关系
直接上代码,你用线程池当中的Executors.newSingleThreadExecutor();代码如下:
package test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; public class TestAtomicInteger implements Runnable{ public static AtomicInteger atomic = new AtomicInteger(); int i = 0; @Override public void run(){ try { Thread.sleep(100); int preVal = atomic.get(); int val = atomic.incrementAndGet(); System.out.println(preVal+" ########### "+val); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { TestAtomicInteger test = new TestAtomicInteger(); ExecutorService executor = Executors.newSingleThreadExecutor(); for(int i = 0;i < 100; i++){ executor.execute(test); } } }
输出结果如下:0 ########### 11 ########### 22 ########### 33 ########### 44 ########### 55 ########### 66 ########### 77 ########### 88 ########### 99 ########### 1010 ########### 1111 ########### 1212 ########### 1313 ########### 1414 ########### 1515 ########### 1616 ########### 1717 ########### 1818 ########### 1919 ########### 2020 ########### 2121 ########### 2222 ########### 2323 ########### 2424 ########### 2525 ########### 2626 ########### 2727 ########### 2828 ########### 2929 ########### 3030 ########### 3131 ########### 3232 ########### 3333 ########### 3434 ########### 3535 ########### 3636 ########### 3737 ########### 3838 ########### 3939 ########### 4040 ########### 4141 ########### 4242 ########### 4343 ########### 4444 ########### 4545 ########### 4646 ########### 4747 ########### 4848 ########### 4949 ########### 5050 ########### 5151 ########### 5252 ########### 5353 ########### 5454 ########### 5555 ########### 5656 ########### 5757 ########### 5858 ########### 5959 ########### 6060 ########### 6161 ########### 6262 ########### 6363 ########### 6464 ########### 6565 ########### 6666 ########### 6767 ########### 6868 ########### 6969 ########### 7070 ########### 7171 ########### 7272 ########### 7373 ########### 7474 ########### 7575 ########### 7676 ########### 7777 ########### 7878 ########### 7979 ########### 8080 ########### 8181 ########### 8282 ########### 8383 ########### 8484 ########### 8585 ########### 8686 ########### 8787 ########### 8888 ########### 8989 ########### 9090 ########### 9191 ########### 9292 ########### 9393 ########### 9494 ########### 9595 ########### 9696 ########### 9797 ########### 9898 ########### 9999 ########### 100
Atomic类中的value值都是一些被volatile标注的类型, volatile是java提供的轻量级变量同步机制,它确保了变量可见性,即任何一个线程修改了volatile修饰的变量,其他线程将立即可见.对于普通变量因为存在主内存和工作区内存的复制和同步,所以无法具备此特性.volatile变量存储在主内中,任何线程需要使用此变量时,必须再次read,因为其他线程对此变量的更改,将会被其他线程在使用此变量时立即获得新值.volatile只是保证了可见性,但是它并非线程安全,因为如果线程一旦read到此值然后进行计算,在尚未write到主内存时其他线程也做了同样的操作,那么volatile变量的最终结果将无法达到预期..如果期望volatile变量线程安全,必须同步或者CAS.volatile变量操作时,read->load->use三个操作是连续的,assign->store->write三个操作是连续的.里面采用的是CAS(compareAndSet)的值替换方法,像一种"乐观锁",通过"比较"-"更新"这种无阻塞的手段实现数据在多线程下的"安全性".
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
AtomicInteger 的incrementAndGet 保证对整数的递增和获取是原子的,
值+1
返回值
一个线程在这两个操作之间不会强行插入另外的线程
你要保证顺序,那么需要的是线程互斥
你输出的右边不会重复也不会漏,这就是它的线程安全保证
AtomicInteger是一个原子类,顾名思义,它能保证一些操作是原子性的,比如说++、--等操作,这些操作在多线程的情况并不是线程安全的,但是使用原子类可以保证这些操作的原子性,从而来保证线程的安全性。简单说说吧。
线程安全是在多线程环境下,数据的增加和减少是安全的,例子中数据不重复就代表了线程安全了。
2.顺序问题是有线程执行的顺序决定的,和线程安全没关系
直接上代码,你用线程池当中的Executors.newSingleThreadExecutor();代码如下:
输出结果如下:
0 ########### 1
1 ########### 2
2 ########### 3
3 ########### 4
4 ########### 5
5 ########### 6
6 ########### 7
7 ########### 8
8 ########### 9
9 ########### 10
10 ########### 11
11 ########### 12
12 ########### 13
13 ########### 14
14 ########### 15
15 ########### 16
16 ########### 17
17 ########### 18
18 ########### 19
19 ########### 20
20 ########### 21
21 ########### 22
22 ########### 23
23 ########### 24
24 ########### 25
25 ########### 26
26 ########### 27
27 ########### 28
28 ########### 29
29 ########### 30
30 ########### 31
31 ########### 32
32 ########### 33
33 ########### 34
34 ########### 35
35 ########### 36
36 ########### 37
37 ########### 38
38 ########### 39
39 ########### 40
40 ########### 41
41 ########### 42
42 ########### 43
43 ########### 44
44 ########### 45
45 ########### 46
46 ########### 47
47 ########### 48
48 ########### 49
49 ########### 50
50 ########### 51
51 ########### 52
52 ########### 53
53 ########### 54
54 ########### 55
55 ########### 56
56 ########### 57
57 ########### 58
58 ########### 59
59 ########### 60
60 ########### 61
61 ########### 62
62 ########### 63
63 ########### 64
64 ########### 65
65 ########### 66
66 ########### 67
67 ########### 68
68 ########### 69
69 ########### 70
70 ########### 71
71 ########### 72
72 ########### 73
73 ########### 74
74 ########### 75
75 ########### 76
76 ########### 77
77 ########### 78
78 ########### 79
79 ########### 80
80 ########### 81
81 ########### 82
82 ########### 83
83 ########### 84
84 ########### 85
85 ########### 86
86 ########### 87
87 ########### 88
88 ########### 89
89 ########### 90
90 ########### 91
91 ########### 92
92 ########### 93
93 ########### 94
94 ########### 95
95 ########### 96
96 ########### 97
97 ########### 98
98 ########### 99
99 ########### 100
Atomic类中的value值都是一些被volatile标注的类型, volatile是java提供的轻量级变量同步机制,它确保了变量可见性,即任何一个线程修改了volatile修饰的变量,其他线程将立即可见.对于普通变量因为存在主内存和工作区内存的复制和同步,所以无法具备此特性.volatile变量存储在主内中,任何线程需要使用此变量时,必须再次read,因为其他线程对此变量的更改,将会被其他线程在使用此变量时立即获得新值.
volatile只是保证了可见性,但是它并非线程安全,因为如果线程一旦read到此值然后进行计算,在尚未write到主内存时其他线程也做了同样的操作,那么volatile变量的最终结果将无法达到预期..如果期望volatile变量线程安全,必须同步或者CAS.volatile变量操作时,read->load->use三个操作是连续的,assign->store->write三个操作是连续的.
里面采用的是CAS(compareAndSet)的值替换方法,像一种"乐观锁",通过"比较"-"更新"这种无阻塞的手段实现数据在多线程下的"安全性".