当多个线程操作同一个共有数据时,一个线程对共有数据的改变会影响到另一个线程。比如下面这个例子:两个线程调用同一个对象的的方法,一个线程的执行结果会影响另一个线程。

 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 }
线程结果互相影响

相关文章: