java---教你怎么判断多线程是否安全

多线程不安全,主要由于cpu分配机制,谁得到了cpu谁就能执行,所以形成了线程的不安全.安全

那么,如何找出问题呢?markdown

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

根据以上三部.下面看例子,ide

package com.niuli.develop;

public class Test {
    public static void main (String [] args) {
        Cus c = new Cus();
        new Thread(c).start();
        new Thread(c).start();
    }
}

class Bank{
    private int sum = 0;
    public void add(int n) {
        sum = sum + n;
        System.out.println("sum= "+sum);
    }
}

class Cus implements Runnable{
    Bank b = new Bank();
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            b.add(100);
        }
    }
}

很简单的例子,
首先第一步,找到多线程运行的代码函数

也就是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,有两条语句使用的,因此就会出现线程安全问题,spa

解决办法,同步块线程

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

或者,同步函数code

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

以上就是线程安全的解决办法,同步机制虽然游侠,可是带来了必定的性能损耗,因此,对操做共享数据的部分执行同步,尽可能减小这种损耗对象

补充:

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

相关文章
相关标签/搜索