总览
- 多线程+对象在方法内部
- 多线程+对象在方法外部
- 多线程+单对象+synchronized
- 多线程+多对象+synchronized
- 多线程+synchronized+static
- 多线程+单对象+synchronized+static
- 多线程+多对象+synchronized+static
多线程+对象在方法内部(例子)
(1)HasSelPrivateNum.java类
public class HasSelPrivateNum {
public void addI(String username) {
try {
int num = 0;//注意此时num变量在addI()方法的内部
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) {
e.printStackTrace();
}
}
}
(2)ThreadA.java
public class ThreadA extends Thread {
private HasSelPrivateNum numRef;
public ThreadA(HasSelPrivateNum numRef) {
super();
this.numRef = numRef;
}
@Override
public void run() {
super.run();
numRef.addI("a");
}
}
(3)ThreadB.java
public class ThreadB extends Thread {
private HasSelPrivateNum numRef;
public ThreadB(HasSelPrivateNum numRef) {
super();
this.numRef = numRef;
}
@Override
public void run() {
super.run();
numRef.addI("b");
}
}
(4)Run.java
public class Run {
public static void main(String[] args) {
HasSelPrivateNum numRef = new HasSelPrivateNum();
ThreadA a = new ThreadA(numRef);
a.start();
ThreadB b = new ThreadB(numRef);
b.start();
}
}
运行结果
总结
-
“非线程安全”问题存在于“实例变量中”,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。
-
方法中的变量不存在非线程安全问题,永远都是线程安全的。这是方法内部的变量私有的特性造成的
-
如果将变量放到方法的外部,则可能出现线程安全问题 ,也就是多线程+对象在方法外部的情况,下一篇有举例说明,例子中的代码和这个几乎一样,只是将变量的位置放到了方法外部而已。