当多个线程操作同一个共有数据时,一个线程对共有数据的改变会影响到另一个线程。比如下面这个例子:两个线程调用同一个对象的的方法,一个线程的执行结果会影响另一个线程。
1 package com.sky.thread; 2 3 public class TestThreadLocal { 4 public static void main(String[] args) { 5 final ThreadLocalBiz biz = new ThreadLocalBiz(); 6 new Thread(new Runnable() { 7 8 @Override 9 public void run() { 10 while (true) { 11 try { 12 Thread.sleep(500); 13 } catch (InterruptedException e) { 14 // TODO Auto-generated catch block 15 e.printStackTrace(); 16 } 17 biz.add(); 18 19 } 20 } 21 }).start(); 22 new Thread(new Runnable() { 23 24 @Override 25 public void run() { 26 while (true) { 27 try { 28 Thread.sleep(500); 29 } catch (InterruptedException e) { 30 // TODO Auto-generated catch block 31 e.printStackTrace(); 32 } 33 biz.add(); 34 35 } 36 } 37 }).start(); 38 } 39 } 40 41 class ThreadLocalBiz { 42 private int num = 0; 43 44 public synchronized void add() { 45 num++; 46 System.out.println("线程:" + Thread.currentThread().getName() + "num:" 47 + num); 48 } 49 }