线程变量在以下情况下是安全的:
1. 线程私有变量:每一个线程都是独立的生成实例。例如:
count是TestRunable的私有变量,a和b都是独立的线程实例,count是线程安全的。
public class TestRunable implements Runnable {
private int count=0;
@Override
public void run() {
...
}
}
public static void main(String[] args) {
Thread a = new Thread(new TestRunable());
Thread b = new Thread(new TestRunable());
a.start();
b.start();
}
同样是TestRunable,a和b利用同一个Runable实例生成线程,则count为线程不安全的。
public class TestRunable implements Runnable {
private int count=0;
@Override
public void run() {
...
}
}
public static void main(String[] args) {
TestRunable runable=new TestRunable();
Thread a = new Thread(runable, "a");
Thread b = new Thread(runable, "b");
a.start();
b.start();
}
2. run方法的局部变量。如下count是线程安全的。
public class TestRunable implements Runnable {
@Override
public void run() {
int count=0;
...
}
}
3. ThreadLocal声明的变量。如下count是线程安全的。
public class TestRunable implements Runnable {
private ThreadLocal<Integer> count = new ThreadLocal<Integer>();
@Override
public void run() {
...
}
}
最后,举个ThreadLocal的实例:
public class TestRunable implements Runnable {
private ThreadLocal<Integer> count = new ThreadLocal<Integer>();
@Override
public void run() {
if(count.get()==null){
count.set(0);
}
while (count.get().intValue()< 10) {
count.set(count.get().intValue()+1);
try {
Thread.sleep(new Random().nextInt(3000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread" + Thread.currentThread().getName() + " Count:" + count.get().intValue());
}
}
}
public class ThreadTest {
public static void main(String[] args) {
TestRunable runable=new TestRunable();
Thread a = new Thread(runable, "a");
Thread b = new Thread(runable, "b");
a.start();
b.start();
}
}
结果输出证明count是线程安全的,两个线程输出结果都是从1到10:
Threada Count:1
Threada Count:2
Threadb Count:1
Threada Count:3
Threadb Count:2
Threada Count:4
Threada Count:5
Threadb Count:3
Threada Count:6
Threadb Count:4
Threada Count:7
Threadb Count:5
Threada Count:8
Threada Count:9
Threadb Count:6
Threadb Count:7
Threada Count:10
Threadb Count:8
Threadb Count:9
Threadb Count:10