线程变量在以下情况下是安全的:
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