zoukankan      html  css  js  c++  java
  • 简单多线程是否安全判断

    1.明确哪些代码是多线程运行的代码, 
    2.明确共享数据 
    3.明确多线程运行代码中哪些语句是操作共享数据.

    首先第一步,找到多线程运行的代码

    也就是run方法里面的代码
    for (int i = 0; i < 3; i++) {
                b.add(100);
            }
            另外这里用到了Add方法,所以add也算
     public void add(int n) {
            sum = sum + n;
            System.out.println("sum= "+sum);
        }

    第二步,找到共享数据

    Bank b = new Bank();
    private int sum = 0;

    第三步,明确多线程使用的共享数据. 
    首先对于数据b就一条语句使用了这个共享变量,因此不会出现线程不安全,但是对于sum,有两条语句使用的,所以就会出现线程安全问题,

    解决办法,同步块

    Object obj = new Object();
        public void add(int n) {
            synchronized (obj) {
                sum = sum + n;
                System.out.println("sum= "+sum);
            }
        }

    或者,同步函数

    public synchronized void add(int n) {
                sum = sum + n;
                System.out.println("sum= "+sum);
        }

    以上就是线程安全的解决办法,同步机制虽然游侠,但是带来了一定的性能损耗,所以,对操作共享数据的部分执行同步,尽量减少这种损耗

    补充:

    如果同步函数是静态的,那么使用的锁就必须是所在类的字节码文件对象,也就是 类名.class,解释来说,静态是和类一起加载的,所以在静态加载的时候是不可能有object的对象,所以锁就必须用在静态加在之前的一个对象.

  • 相关阅读:
    Delphi中 StrToIntDef函数的用法:
    Delphi判断文件夹(目录)是否存在,不存在就创建一个,可以一次创建多级目录
    Delphi中Format的字符串格式化使用说明
    linux下可变参数打印
    c++11 thread
    QMessageBox 使用
    Ubuntu虚拟机配置nfs
    test
    Qt 布局时组建不贴边
    QPainter 居中写字
  • 原文地址:https://www.cnblogs.com/chenxuezhouLearnProgram/p/5779715.html
Copyright © 2011-2022 走看看