在多线程状态下,实例变量在多个线程间共享,而局部变量是线程独享的,即每个线程有自己关于改变量的副本,因此不会发生由多个线程改写该变量的值而导致数据错乱。
示例代码如下:
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
转载于:https://blog.51cto.com/keeplearning/1149330