Atomic类和线程同步新机制


	Atomic类和线程同步新机制
[编程语言教程]

一、为什么要使用Atomic类?

看一下下面这个小程序,模拟计数,创建10个线程,共同访问这个int  count = 0 ;每个线程给count往上加10000,这个时候你需要加锁,如果不加锁会出现线程安全问题,但是使用AtomicInteger之后就不用再做加锁的操作了,因为AtomicInteger内部使用了CAS操作,直接无锁往上递增,有人会问问什么会出现无锁操作,答案只有一个:那就是快呗;

下面是AtomicInteger的使用方法:

package com.example.demo.threaddemo.juc_008;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author D-L
 * @Classname T01_AtomicInteger
 * @Version 1.0
 * @Description 使用AtomicInteger类代替synchronized
 * @Date 2020/7/22
 */
public class T01_AtomicInteger {
//    int count = 0;
     AtomicInteger count = new AtomicInteger(0);

    public /**synchronized*/ void m(){
        for (int i = 0; i < 10000; i++) {
//            count++;
            count.incrementAndGet();
        }
    }

    public static void main(String[] args) {
        T01_AtomicInteger t = new T01_AtomicInteger();
        List<Thread> threads = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            threads.add(new Thread(t::m ,"Thread" + i));
        }
        threads.forEach(o -> o.start());
        threads.forEach(o ->{
            try {
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
       /* for (int i = 0; i < 10; i++) {
            new Thread(t::m ,"Thread"+i).start();
        }
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        System.out.println(t.count);
    }
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Atomic类和线程同步新机制