看了java编程思想的并发这一章,发现对于synchronized关键字理解不够到位,看了其他人的博客,加深了一些理解:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
如代码:
package edu.other;发现当getValue()方法 不加synchronized关键字时,main方法里的while循环里面会打印奇数,而加了synchronized关键字则不会打印。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class AtomicityTest implements Runnable{
private int i=0;
public synchronized int getValue(){
return i;
}
private synchronized void evenIncrement(){
i++;
i++;
}
public void run() {
while(true){
evenIncrement();
}
}
public static void main(String[] args) {
ExecutorService exe = Executors.newCachedThreadPool();
AtomicityTest at = new AtomicityTest();
exe.execute(at);
while(true){
int val = at.getValue();
if(val%2!=0)
System.out.println(val);
}
}
}
这是因为不同线程访问同一对象时,synchronized方法具有一致性,当被某一线程执行某一synchronized方法时,其他线程执行所有的synchronized方法时都会被阻塞,而对于非synchronized方法则可以并发执行。
当exe.execute(at)时,线程池里的线程死循环执行evenIncrement(),而getValue()方法不是synchronized时,则主线程可以执行,当然会出现奇数的情况。当getValue()方法是synchronized时,当执行evenIncrement()时,所有其他的synchronized类型的方法都会被阻塞,主线程也没办法访问,因此不会打印奇数。