同步块
同步关键字synchronized
java中的同步代码块用synchronized标记,同步在某个对象上。对象上的同步块只能被一个线程进入并进行操作,其它线程等待,进入阻塞状态。直到进入同步块的线程退出。java中有四种不同的同步块:
1. 实例方法;
2. 静态方法;
3. 实例方法中的同步块;
4. 静态方法中的同步块。
实例方法同步
public synchronized void add(int value){
this.count+=value;
}
在方法中声明关键字synchronized,表示该方法是同步的。实例方法同步是同步在拥有该方法的对象上的,因此每个实例其方法同步其实都同步在了不同的对象上。每个实例对象持有一个线程,如果有多个实例,那么就应该对应有多个线程。
静态方法同步
public static synchronized void add(int value){
this.count+=value;
}
该方法同步在方法所属的类对象上,而在JVM中,一个类只能对应一个类对象,所以同步时只允许一个线程执行一个类的静态同步方法。
实例方法中的同步块
有时是不需要对整个方法进行同步,而只需要同步其中的某一部分。
在非同步的方法中的同步块:
public void add(int value){
synchronized(this){
this.count+=value;
}
}
在同步构造器中用()包含起来的叫做监视器对象。本例中,同步实例方法使用调用该方法的实例本身(this)作为监视器对象。一次只能有一个线程在同步于同一个监视器对象的 Java 方法内执行。
静态方法中的同步块
public Class MyClass{
public static void plus(int value){
this.count+=value;
}
public static void add(int value){
synchronized(MyClass.class){
this.count+=value;
}
}
}
}
这两个静态方法是不能同时执行的。
除非方法2中的同步对象不是MyClass。