举个例子,场景:
循环启用3条线程,打印计数信息 。
第一种:传统的错误写法:
//循环启用3条线程,打印计数信息 错误示例
public class JUC {
static Integer num = 0;
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (num <100){
System.out.println("thread name: "+Thread.currentThread().getName()+"----" +num++);
}
}
});
t.start();
}
}
}
输出结果如下:
"C:\Program Files\Java\jdk1.8.0_73\bin\java.exe" "-javaagent:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar=14046:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_73\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\rt.jar;D:\tools\IDEAProject\test\out\production\test;D:\tools\mq\apache-activemq-5.15.14\activemq-all-5.15.14.jar" com.alfrd.JUC
thread name: Thread-0----0
thread name: Thread-0----1
thread name: Thread-0----2
thread name: Thread-0----3
thread name: Thread-0----4
thread name: Thread-0----5
thread name: Thread-0----6
thread name: Thread-0----7
thread name: Thread-0----8
thread name: Thread-0----9
thread name: Thread-1----10
thread name: Thread-0----11
thread name: Thread-1----12
thread name: Thread-0----13
thread name: Thread-1----14
thread name: Thread-1----16
thread name: Thread-1----17
thread name: Thread-1----18
thread name: Thread-1----19
thread name: Thread-1----20
thread name: Thread-1----21
thread name: Thread-1----22
thread name: Thread-0----15
thread name: Thread-0----24
thread name: Thread-0----25
thread name: Thread-0----26
thread name: Thread-1----23
thread name: Thread-0----27
thread name: Thread-1----28
thread name: Thread-0----29
thread name: Thread-0----31
thread name: Thread-0----32
thread name: Thread-0----33
thread name: Thread-0----34
thread name: Thread-0----35
thread name: Thread-0----36
thread name: Thread-0----37
thread name: Thread-0----38
thread name: Thread-0----39
thread name: Thread-0----40
thread name: Thread-0----41
thread name: Thread-0----42
thread name: Thread-0----43
thread name: Thread-0----44
thread name: Thread-0----45
thread name: Thread-0----46
thread name: Thread-0----47
thread name: Thread-0----48
thread name: Thread-0----49
thread name: Thread-0----50
thread name: Thread-0----51
thread name: Thread-0----52
thread name: Thread-0----53
thread name: Thread-0----54
thread name: Thread-0----55
thread name: Thread-0----56
thread name: Thread-0----57
thread name: Thread-1----30
thread name: Thread-0----58
thread name: Thread-1----59
thread name: Thread-0----60
thread name: Thread-1----61
thread name: Thread-0----62
thread name: Thread-1----63
thread name: Thread-0----64
thread name: Thread-1----65
thread name: Thread-0----66
thread name: Thread-1----67
thread name: Thread-0----68
thread name: Thread-1----69
thread name: Thread-0----70
thread name: Thread-1----71
thread name: Thread-1----73
thread name: Thread-0----72
thread name: Thread-1----74
thread name: Thread-0----75
thread name: Thread-1----76
thread name: Thread-0----77
thread name: Thread-1----78
thread name: Thread-0----79
thread name: Thread-1----80
thread name: Thread-0----81
thread name: Thread-1----82
thread name: Thread-0----83
thread name: Thread-1----84
thread name: Thread-1----85
thread name: Thread-1----86
thread name: Thread-0----84
thread name: Thread-1----88
thread name: Thread-2----87
thread name: Thread-1----90
thread name: Thread-0----89
thread name: Thread-1----92
thread name: Thread-2----91
thread name: Thread-1----94
thread name: Thread-0----93
thread name: Thread-0----97
thread name: Thread-1----96
thread name: Thread-2----95
thread name: Thread-1----99
thread name: Thread-0----98
第二种改进写法:
//通过互斥锁进行改进 悲观锁
public class JUCEditonTwo {
static Integer num = 0;
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (JUCEditonTwo.class){
while (num <100){
System.out.println("thread name: "+Thread.currentThread().getName()+"----" +num++);
}
}
}
});
t.start();
}
}
}
输出结果如下,由一个线程依次拿到资源:
"C:\Program Files\Java\jdk1.8.0_73\bin\java.exe" "-javaagent:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar=4860:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_73\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\rt.jar;D:\tools\IDEAProject\test\out\production\test;D:\tools\mq\apache-activemq-5.15.14\activemq-all-5.15.14.jar" com.alfrd.JUCEditonTwo
thread name: Thread-0----0
thread name: Thread-0----1
thread name: Thread-0----2
thread name: Thread-0----3
thread name: Thread-0----4
thread name: Thread-0----5
thread name: Thread-0----6
thread name: Thread-0----7
thread name: Thread-0----8
thread name: Thread-0----9
thread name: Thread-0----10
thread name: Thread-0----11
thread name: Thread-0----12
thread name: Thread-0----13
thread name: Thread-0----14
thread name: Thread-0----15
thread name: Thread-0----16
thread name: Thread-0----17
thread name: Thread-0----18
thread name: Thread-0----19
thread name: Thread-0----20
thread name: Thread-0----21
thread name: Thread-0----22
thread name: Thread-0----23
thread name: Thread-0----24
thread name: Thread-0----25
thread name: Thread-0----26
thread name: Thread-0----27
thread name: Thread-0----28
thread name: Thread-0----29
thread name: Thread-0----30
thread name: Thread-0----31
thread name: Thread-0----32
thread name: Thread-0----33
thread name: Thread-0----34
thread name: Thread-0----35
thread name: Thread-0----36
thread name: Thread-0----37
thread name: Thread-0----38
thread name: Thread-0----39
thread name: Thread-0----40
thread name: Thread-0----41
thread name: Thread-0----42
thread name: Thread-0----43
thread name: Thread-0----44
thread name: Thread-0----45
thread name: Thread-0----46
thread name: Thread-0----47
thread name: Thread-0----48
thread name: Thread-0----49
thread name: Thread-0----50
thread name: Thread-0----51
thread name: Thread-0----52
thread name: Thread-0----53
thread name: Thread-0----54
thread name: Thread-0----55
thread name: Thread-0----56
thread name: Thread-0----57
thread name: Thread-0----58
thread name: Thread-0----59
thread name: Thread-0----60
thread name: Thread-0----61
thread name: Thread-0----62
thread name: Thread-0----63
thread name: Thread-0----64
thread name: Thread-0----65
thread name: Thread-0----66
thread name: Thread-0----67
thread name: Thread-0----68
thread name: Thread-0----69
thread name: Thread-0----70
thread name: Thread-0----71
thread name: Thread-0----72
thread name: Thread-0----73
thread name: Thread-0----74
thread name: Thread-0----75
thread name: Thread-0----76
thread name: Thread-0----77
thread name: Thread-0----78
thread name: Thread-0----79
thread name: Thread-0----80
thread name: Thread-0----81
thread name: Thread-0----82
thread name: Thread-0----83
thread name: Thread-0----84
thread name: Thread-0----85
thread name: Thread-0----86
thread name: Thread-0----87
thread name: Thread-0----88
thread name: Thread-0----89
thread name: Thread-0----90
thread name: Thread-0----91
thread name: Thread-0----92
thread name: Thread-0----93
thread name: Thread-0----94
thread name: Thread-0----95
thread name: Thread-0----96
thread name: Thread-0----97
thread name: Thread-0----98
thread name: Thread-0----99
第三种写法:
//无锁同步 乐观锁 自旋锁 默认是10次
public class JUCEditionThree {
static AtomicInteger num = new AtomicInteger(0);
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (num.get() < 100){
System.out.println("thread name: "+Thread.currentThread().getName()+"----" +num.incrementAndGet());
}
}
});
t.start();
}
}
}
"C:\Program Files\Java\jdk1.8.0_73\bin\java.exe" "-javaagent:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\lib\idea_rt.jar=4930:C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2020.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_73\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_73\jre\lib\rt.jar;D:\tools\IDEAProject\test\out\production\test;D:\tools\mq\apache-activemq-5.15.14\activemq-all-5.15.14.jar" com.alfrd.JUCEditionThree
thread name: Thread-0----1
thread name: Thread-0----2
thread name: Thread-0----3
thread name: Thread-0----4
thread name: Thread-0----5
thread name: Thread-0----6
thread name: Thread-0----7
thread name: Thread-0----8
thread name: Thread-0----9
thread name: Thread-0----10
thread name: Thread-0----11
thread name: Thread-0----12
thread name: Thread-0----13
thread name: Thread-0----14
thread name: Thread-0----15
thread name: Thread-0----16
thread name: Thread-0----17
thread name: Thread-0----18
thread name: Thread-0----19
thread name: Thread-0----20
thread name: Thread-0----21
thread name: Thread-0----22
thread name: Thread-0----23
thread name: Thread-0----24
thread name: Thread-0----25
thread name: Thread-0----26
thread name: Thread-0----27
thread name: Thread-0----28
thread name: Thread-0----29
thread name: Thread-0----30
thread name: Thread-0----31
thread name: Thread-0----32
thread name: Thread-0----33
thread name: Thread-0----34
thread name: Thread-0----35
thread name: Thread-0----36
thread name: Thread-0----37
thread name: Thread-0----38
thread name: Thread-0----39
thread name: Thread-0----40
thread name: Thread-0----41
thread name: Thread-0----42
thread name: Thread-0----43
thread name: Thread-0----44
thread name: Thread-0----45
thread name: Thread-0----46
thread name: Thread-0----47
thread name: Thread-0----48
thread name: Thread-0----49
thread name: Thread-0----50
thread name: Thread-0----51
thread name: Thread-0----52
thread name: Thread-0----53
thread name: Thread-0----54
thread name: Thread-0----55
thread name: Thread-0----56
thread name: Thread-0----57
thread name: Thread-0----58
thread name: Thread-0----59
thread name: Thread-0----60
thread name: Thread-0----61
thread name: Thread-0----62
thread name: Thread-0----63
thread name: Thread-0----64
thread name: Thread-0----65
thread name: Thread-0----66
thread name: Thread-0----67
thread name: Thread-0----68
thread name: Thread-0----69
thread name: Thread-0----70
thread name: Thread-0----71
thread name: Thread-0----72
thread name: Thread-0----73
thread name: Thread-0----74
thread name: Thread-0----75
thread name: Thread-0----76
thread name: Thread-0----77
thread name: Thread-0----78
thread name: Thread-0----79
thread name: Thread-0----80
thread name: Thread-0----81
thread name: Thread-0----82
thread name: Thread-0----83
thread name: Thread-0----84
thread name: Thread-0----85
thread name: Thread-0----86
thread name: Thread-0----87
thread name: Thread-0----88
thread name: Thread-0----89
thread name: Thread-0----90
thread name: Thread-0----91
thread name: Thread-0----92
thread name: Thread-0----93
thread name: Thread-0----94
thread name: Thread-0----95
thread name: Thread-0----96
thread name: Thread-0----97
thread name: Thread-0----98
thread name: Thread-0----99
thread name: Thread-0----100
本文对比了Java中传统循环创建线程、使用互斥锁悲观锁与无锁乐观锁自旋锁的三种实现,展示了如何避免竞态条件并提高线程安全性。
172万+

被折叠的 条评论
为什么被折叠?



