上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 方法中的变量呈线程安全状态
方法中的变量不存在非线程安全问题,永远都是线程安全的,这是因为方法内部的变量具有私有特性。