java线程中CAS的写法

本文对比了Java中传统循环创建线程、使用互斥锁悲观锁与无锁乐观锁自旋锁的三种实现,展示了如何避免竞态条件并提高线程安全性。

举个例子,场景:

循环启用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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值