• Java线程安全


    线程安全的意思就是说在多线程的随机调用下,代码没有出现bug 或者说代码没有bug 都能够符合预期的方式来执行的就叫做线程安全

    如果在多线程的随机调用下 出现了bug 那就是线程不安全 

    那怎么样才算是bug 是看对这个产品的需求  如果满足需求则没有bug(线程安全) 反之则是线程不安全

    class Counter {
        public int count = 0;
    
        public void increase() {
            count++;
        }
    }
    
    public class Demo {
        private static Counter counter = new Counter();
    
        public static void main(String[] args) {
            Thread t1 = new Thread(() -> {
                for (int i = 0; i < 50000; i++) {
                    counter.increase();
                }
            });
    
            Thread t2 = new Thread(() -> {
                for (int i = 0; i < 50000; i++) {
                    counter.increase();
                }
            });
    
            t1.start();
            t2.start();
    
            try {
                t1.join();
                t2.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            //按道理说 创建两个Thread对象 每个对象实行5W次 一共就是10W次
            //但是 最终打印的答案却不相匹配 这就是bug
    
            /**
             * 其实执行的 count++ 这个操作的底层 是三条指令 都是在 CPU 上完成的
             * (1) 把内存的数据读取到 CPU 寄存器中  这个操作叫做 load
             * (2) 把 CPU 的寄存器中的值进行计算(+1) 这个操作叫做 add
             * (3) 把寄存器中的值再写回到内存中       这个操作叫做 save
             *
             *  由于是两个线程进行的去修改变量 而每次修改都是三个操作步骤 因为线程调度的顺序是不稳定的
             *  因此 两个线程在真正执行这些操作的时候 就可能会有对总执行的排序顺序 也就会造成答案的不稳定 不唯一
             *  
             */
            System.out.println("counter: " + counter.count);
    
        }
    }
    
  • 相关阅读:
    nodejs+vue留学生交流互动论坛网站Elementui前端项目推荐
    c++ barrier 使用详解
    MySQL 存储引擎、事务、多版本并发控制(MVCC)、数据类型
    DNS入门学习:什么是TTL值?如何设置合适的TTL值?
    AVL的代码剖析(c++)
    Tomcat 异步组件 —— Nio2Endpoint
    Nginx中server_name指令介绍
    Java源码分析 | CharSequence
    ubuntu20.04 安装cudnn
    Python-scapy模块的使用
  • 原文地址:https://blog.csdn.net/m0_63101235/article/details/126338235