Java 同步关键字(synchronized)
Java中的同步块用synchronized标记。同步块在Java中是同步在某个对象上。所有同步在一个对象上的同步块在同时只能被一个线程进入并执行操作。所有其他等待进入该同步块的线程将被阻塞,直到执行该同步块中的线程退出。
有四种不同的同步块:
实例方法
静态方法
实例方法中的同步块
静态方法中的同步块
同步目的就是保证写资源的唯一性;那么当一个资源需要的同步的时候用同步代码块,当一个方法中很多资源需要同步的时候,用同步方法更方便。我们也不关心这个方法是不是静态的,只关心它有没有操作共享资源。
实例:
public class Counter{
long count = 0;
public synchronized void add(long value){
this.count += value;
}
}
public class CounterThread extends Thread{
protected Counter counter = null;
public CounterThread(Counter counter){
this.counter = counter;
}
public void run() {
for(int i=0; i<10; i++){
counter.add(i);
}
}
}
public class Example {
public static void main(String[] args){
Counter counter = new Counter();
//两个thread对同一个实例进行操作,每次 只有一个线程可以 执行同步方法
//如果new两个实例两个线程分别引用的是不同的实例,则执行同步方法不会有任何一个线程会阻塞
//如果同步方法是静态方法或静态代码块,两个线程引用的是类对象,整个jvm中只有一个对象, 每次 只有一个线程可以 执行同步方法
Thread threadA = new CounterThread(counter);
Thread threadB = new CounterThread(counter);
threadA.start();
threadB.start();
}
}
网友评论