Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

2.1.1 方法内的变量是线程安全的

非线程安全问题存在于实例变量中,如果是方法内部私有变量,则不存在非线程安全问题,结果是线程安全的。

下面的示例项目用于演示方法内部声明一个变量时,是不存在“非线程安全”问题的。

创建t1项目,HasSelfPrivateNum.java文件代码如下:


package service;

public class HasSelfPrivateNum {

public void addI(String username) {
    try {
        int num = 0;
        if (username.equals("a")) {
            num = 100;
            System.out.println("a set over!");
            Thread.sleep(2000);
        } else {
            num = 200;
            System.out.println("b set over!");
        }
        System.out.println(username + " num=" + num);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

文件ThreadA.java代码如下:


package extthread;

import service.HasSelfPrivateNum;

public class ThreadA extends Thread {

private HasSelfPrivateNum numRef;

public ThreadA(HasSelfPrivateNum numRef) {
    super();
    this.numRef = numRef;
}

@Override
public void run() {
    super.run();
    numRef.addI("a");
}

}

文件ThreadB.java代码如下:


package extthread;

import service.HasSelfPrivateNum;

public class ThreadB extends Thread {

private HasSelfPrivateNum numRef;

public ThreadB(HasSelfPrivateNum numRef) {
    super();
    this.numRef = numRef;
}

@Override
public void run() {
    super.run();
    numRef.addI("b");
}

}

文件Run.java代码如下:


package test;

import service.HasSelfPrivateNum;
import extthread.ThreadA;
import extthread.ThreadB;

public class Run {

public static void main(String[] args) {

    HasSelfPrivateNum numRef = new HasSelfPrivateNum();

    ThreadA athread = new ThreadA(numRef);
    athread.start();

    ThreadB bthread = new ThreadB(numRef);
    bthread.start();

}

}

程序运行结果如图2-1所示。

图2-1 方法中的变量呈线程安全状态

方法中的变量不存在非线程安全问题,永远都是线程安全的,这是因为方法内部的变量具有私有特性。