线程的原子性

1,关于线程安全,如果一个方法里面全部是局部变量,那么是没有必要同步的,也就是说它是线程安全的。也就是不必加 synchronized,servelet里面的的HttpServlet就是这样, PrintWriter out = response.getWriter();这句话中这个out流本来可以作为HttpServlet的类变量的,但是如果是那样就需要同步了,影响效率呀。



2,关于锁,
Java代码

1. class Test{
2. public synchronized void f1(){
3. //do something here
4. }
5. public void f2(){
6. synchronized(this){
7. //do something here
8. }
9. }
10. }

class Test{
public synchronized void f1(){
//do something here
}
public void f2(){
synchronized(this){
//do something here
}
}
}





上面的f1()和f2()效果一致, synchronized取得的锁都是Test某个实列(this)的锁.
比如: Test t = new Test();
线程A调用t.f2()时, 线程B无法进入t.f1(),直到t.f2()结束.
作用: 多线程中访问Test的同一个实例的同步方法时会进行同步.
也就是说在f1()前面加上synchronized ,那线程在调用这个方法的时候取得了这个对象的锁,也就是t的锁,



其他的线程想访问t的其他同步方法,比如f2()就不行,其实这样是不好的,很多时候我们用另外实例变量来锁。


Java代码

1. class Test{
2.
3. private static final Object obj=new Object();
4. public synchronized void f1(){
5. //do something here
6. }
7. public void f2(){
8. synchronized(obj){
9. //do something here
10. }
11. }
12. }

class Test{

private static final Object obj=new Object();
public synchronized void f1(){
//do something here
}
public void f2(){
synchronized(obj){
//do something here
}
}
}

此时,如果一个线程访问f2,它拿到的是obj对象的锁,别的线程依然可以访问f1().



3,原子性,先看代码:


Java代码

1. package com.test;
2.
3.
4.
5. public class Test extends Thread {
6.
7. private int a = 0;
8.
9. private int b = 0;
10.
11. public static void main(String[] args) {
12.
13. Test test = new Test();
14.
15. for (int i = 0; i < 10; i++) {
16.
17. Thread thread = new Thread(test, "thread-" + i);
18.
19. thread.start();
20.
21. }
22.
23. }
24.
25. public synchronized void doWrite() {
26.
27. a++;
28.
29. try {
30.
31. sleep((int)(Math.random()*100));
32.
33. }
34.
35. catch (Exception e) {
36.
37. }
38.
39. b++;
40.
41. try {
42.
43. sleep((int)(Math.random()*100));
44.
45. }
46.
47. catch (Exception e) {
48.
49. }
50.
51. }
52.
53. public synchronized void print() {
54.
55. System.out.println("" + Thread.currentThread().getName() + ":a:" + a);
56.
57. System.out.println("" + Thread.currentThread().getName() + ":b:" + b);
58.
59. }
60.
61. public void run() {
62. f();
63.
64. }
65.
66. public synchronized void f() {
67. for (int i = 0; i < 5; i++) {
68.
69. doWrite();
70.
71. print();
72.
73. }
74. }
75.
76. }

package com.test;


public class Test extends Thread {

private int a = 0;

private int b = 0;

public static void main(String[] args) {

Test test = new Test();

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

Thread thread = new Thread(test, "thread-" + i);

thread.start();

}

}

public synchronized void doWrite() {

a++;

try {

sleep((int)(Math.random()*100));

}

catch (Exception e) {

}

b++;

try {

sleep((int)(Math.random()*100));

}

catch (Exception e) {

}

}

public synchronized void print() {

System.out.println("" + Thread.currentThread().getName() + ":a:" + a);

System.out.println("" + Thread.currentThread().getName() + ":b:" + b);

}

public void run() {
f();

}

public synchronized void f() {
for (int i = 0; i < 5; i++) {

doWrite();

print();

}
}

}





输出结果:
Java代码

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

thread-0:a:1
thread-0:b:1
thread-0:a:2
thread-0:b:2
thread-0:a:3
thread-0:b:3
thread-0:a:4
thread-0:b:4
thread-0:a:5
thread-0:b:5
thread-1:a:6
thread-1:b:6
thread-1:a:7
thread-1:b:7
thread-1:a:8
thread-1:b:8
thread-1:a:9
thread-1:b:9
thread-1:a:10
thread-1:b:10
thread-2:a:11
thread-2:b:11
thread-2:a:12
thread-2:b:12
thread-2:a:13
thread-2:b:13
thread-2:a:14
thread-2:b:14
thread-2:a:15
thread-2:b:15
thread-3:a:16
thread-3:b:16
thread-3:a:17
thread-3:b:17
thread-3:a:18
thread-3:b:18
thread-3:a:19
thread-3:b:19
thread-3:a:20
thread-3:b:20
thread-4:a:21
thread-4:b:21
thread-4:a:22
thread-4:b:22
thread-4:a:23
thread-4:b:23
thread-4:a:24
thread-4:b:24
thread-4:a:25
thread-4:b:25
thread-5:a:26
thread-5:b:26
thread-5:a:27
thread-5:b:27
thread-5:a:28
thread-5:b:28
thread-5:a:29
thread-5:b:29
thread-5:a:30
thread-5:b:30
thread-6:a:31
thread-6:b:31
thread-6:a:32
thread-6:b:32
thread-6:a:33
thread-6:b:33
thread-6:a:34
thread-6:b:34
thread-6:a:35
thread-6:b:35
thread-7:a:36
thread-7:b:36
thread-7:a:37
thread-7:b:37
thread-7:a:38
thread-7:b:38
thread-7:a:39
thread-7:b:39
thread-7:a:40
thread-7:b:40
thread-8:a:41
thread-8:b:41
thread-8:a:42
thread-8:b:42
thread-8:a:43
thread-8:b:43
thread-8:a:44
thread-8:b:44
thread-8:a:45
thread-8:b:45
thread-9:a:46
thread-9:b:46
thread-9:a:47
thread-9:b:47
thread-9:a:48
thread-9:b:48
thread-9:a:49
thread-9:b:49
thread-9:a:50
thread-9:b:50

我们可以看到是很标准的输出。



我们在run方法里面改点东西:


Java代码

1. package com.test;
2.
3.
4.
5. public class Test extends Thread {
6.
7. private int a = 0;
8.
9. private int b = 0;
10.
11. public static void main(String[] args) {
12.
13. Test test = new Test();
14.
15. for (int i = 0; i < 10; i++) {
16.
17. Thread thread = new Thread(test, "thread-" + i);
18.
19. thread.start();
20.
21. }
22.
23. }
24.
25. public synchronized void doWrite() {
26.
27. a++;
28.
29. try {
30.
31. sleep((int)(Math.random()*100));
32.
33. }
34.
35. catch (Exception e) {
36.
37. }
38.
39. b++;
40.
41. try {
42.
43. sleep((int)(Math.random()*100));
44.
45. }
46.
47. catch (Exception e) {
48.
49. }
50.
51. }
52.
53. public synchronized void print() {
54.
55. System.out.println("" + Thread.currentThread().getName() + ":a:" + a);
56.
57. System.out.println("" + Thread.currentThread().getName() + ":b:" + b);
58.
59. }
60.
61. public void run() {
62. for (int i = 0; i < 5; i++) {
63.
64. doWrite();
65.
66. print();
67.
68. }
69.
70. }
71.
72.
73.
74. }

package com.test;


public class Test extends Thread {

private int a = 0;

private int b = 0;

public static void main(String[] args) {

Test test = new Test();

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

Thread thread = new Thread(test, "thread-" + i);

thread.start();

}

}

public synchronized void doWrite() {

a++;

try {

sleep((int)(Math.random()*100));

}

catch (Exception e) {

}

b++;

try {

sleep((int)(Math.random()*100));

}

catch (Exception e) {

}

}

public synchronized void print() {

System.out.println("" + Thread.currentThread().getName() + ":a:" + a);

System.out.println("" + Thread.currentThread().getName() + ":b:" + b);

}

public void run() {
for (int i = 0; i < 5; i++) {

doWrite();

print();

}

}



}



输出的结果就不确定了:


Java代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值