synchronized关键字
方法或代码块的互斥性来完成实际上的一个原子操作。(方法或代码块在被一个线程调用时,其他线程处于等待状态)
所有的Java对象都有一个与synchronzied关联的监视器对象(monitor),允许线程在该监视器对象上进行加锁和解锁操作。
a、静态方法:Java类对应的Class类的对象所关联的监视器对象。
b、实例方法:当前对象实例所关联的监视器对象。
c、代码块:代码块声明中的对象所关联的监视器对象。
所以多线程操作同一个内容并要保持一致性时,就将该对象设为类的静态成员
public class syncTest {
public static int count = 0;
public static synchronized void addC(){
if(count <100){
count ++;
System.out.println(Thread.currentThread().getName() +" "+count);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String args[]){
Thread thread1 = new Thread();
thread1 = new Thread(new Runnable(){
public void run(){
System.out.println("thread1 start run");
while(count <100){
syncTest.addC();
}
}
});
syncTest st = new syncTest();
Thread thread2 = new Thread();
thread2 = new Thread(new Runnable(){
public void run(){
System.out.println("thread2 start run");
while(count <100){
st.addC();
}
}
});
thread1.start();
thread2.start();
}
}
输出:

可以看到,两个线程操作的是同一个数
原文:http://www.cnblogs.com/zxahu/p/4641145.html