多线程之线程不安全演示

1.背景

什么样的代码会导致线程不安全.....

有时后,子类继承重写父类方法后会导致线程不安全....

2.代码演示

package com.ldp.demo01;

import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 姿势帝-博客园
 * @address https://www.cnblogs.com/newAndHui/
 * @WeChat 851298348
 * @create 01/29 8:59
 * @description <p>
 * 线程安全演示
 * 如下的案例将演示本来一个线程安全的类,通过继承后变得线程不安全了
 * 从这个例子可以看出 private 或 final 提供"安全"的意义所在,这就是开闭原则中的闭的重要性
 * </p>
 */
public class Test05Safe {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // 这中情况下操作集合是安全的
        // ThreadSafe thread = new ThreadSafe();
        // 线程不安全
        ThreadUnSafe thread = new ThreadUnSafe();
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10; j++) {
                    thread.operation();
                }
            }, "t-" + i).start();
        }
    }
}

class ThreadSafe {
    /**
     * 操作集合
     */
    public void operation() {
        List<String> list = new ArrayList<>();
        add(list);
        remove(list);
    }

    public void add(List<String> list) {
        list.add("A");
    }

    public void remove(List<String> list) {
        list.remove(0);
    }
}

@Slf4j
class ThreadUnSafe extends ThreadSafe {
    @Override
    public void add(List<String> list) {
        // 这里会导致线程不安全
        new Thread(() -> {
            log.info("..........subAdd");
            list.add("A");
        }, "subAdd-" + System.currentTimeMillis()).start();
    }

    /**
     * 重写父类方法
     *
     * @param list
     */
    @Override
    public void remove(List<String> list) {
        // 这里会导致线程不安全
        new Thread(() -> {
            log.info("subRemove....");
            list.remove(0);
        }, "subRemove" + System.currentTimeMillis()).start();
    }
}

 

完美

posted @ 2022-01-29 21:06  李东平|一线码农  阅读(75)  评论(0编辑  收藏  举报