原子操作类,线程安全集合类,ThreadLocal

一.原子操作类
    1.Atomic+基本数据类型的封装类
    举例:AtomicInteger 解决了多个线程对同一个静态的变量进行改动,所产生的并发问题
        举例代码:
        public class Demo2 {
    private static AtomicInteger atomicInteger = new AtomicInteger(0);    //创建原子整数类

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < 5000; i++) {
                atomicInteger.getAndIncrement();
            }
        });
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 5000; i++) {
                atomicInteger.getAndDecrement();
            }
        });
        thread.start();
        thread1.start();
        thread.join();
        thread1.join();
        System.out.println(atomicInteger);
    }
}
二.线程安全集合类
    1.现有的线程安全的类
        StringBuffer 线程安全
        String       不可变类 , 都是线程安全的
        Random   线程安全
        Vector      实现了List,并且线程安全
        Hashtable 实现了Map,并且线程安全
    2.新增的线程安全集合类
        ConcurrentHashMap 实现了Map,并且线程安全
        ConcurrentSkipListMap 实现了Map(可排序),并且线程安全
        CopyOnWriteArrayList 实现了List,并且线程安全

这里写图片描述
这里写图片描述

有关ThreadLocal的代码
    //             线程局部变量
private static ThreadLocal<SimpleDateFormat> local = new ThreadLocal() {
@Override        // 初始值
protected Object initialValue() {
    return new SimpleDateFormat("yyyy-MM-dd"); // 存入当前线程
}
};


public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
    new Thread(()->{
        try {
            SimpleDateFormat sdf = local.get(); // 获取本线程自己的局部变量
            Date date = sdf.parse("1951-10-09"); // 每个线程使用的是自己的SimpleDateFormat因此没有争用
            System.out.println(Thread.currentThread().getName() + " " + date);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }).start();
}
也解决了线程的并发问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值