在多线程状态下,实例变量在多个线程间共享,而局部变量是线程独享的,即每个线程有自己关于改变量的副本,因此不会发生由多个线程改写该变量的值而导致数据错乱。

示例代码如下:

private static final Object LOCK = new Object();

private int count = 0;

public static void main(String[] args) {

Task task = new Task(); 

Thread thread1 = new Thread(task);
  Thread thread2 = new Thread(task);
  thread1.start();
  thread2.start();

}

private class Task implements Runnable {

  @Override
  public void run() {
   int i = 0;
   while (i < 5) {
    i++;
    //synchronized(LOCK) {
     count++;
    //}
    LOG.info(Thread.currentThread().getName() + ", i="+ i+ ",count="+count);
   }
  }

输出如下:

2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-1, i=1,count=1
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-2, i=1,count=2
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-1, i=2,count=3
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-2, i=2,count=4
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-2, i=3,count=6
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-2, i=4,count=7
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-1, i=3,count=5
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-2, i=5,count=8
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-1, i=4,count=9
2013-3-7 15:13:49 com.mama100.site.snsec.web.mobile.client.MultiThreadVariable$Task run
信息: Thread-1, i=5,count=10