一、Synchronized的含义
Java多线程中的同步机制会对资源进行加锁,保证在同一时间只有一个线程可以操作对应的资源,避免多程同时访问相同资源发生冲突。synchronized关键字就是一种同步锁,可以实现同步机制,保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,并保证一个线程的变化,被其他线程所看到。
二、Synchronized的修饰对象
1.修饰普通方法:一个对象中的加锁方法只允许一个线程访问。但要注意这种情况下锁的是访问该方法的的实例对象,如果多个线程不同对象访问该方法,则无法保持同步。
2.修饰静态方法:由于静态方法是类方法,所以这种情况下锁的是包含这个方法的类,也就是类对象;这样如果多个线程不同对象访问该静态方法,也是可以同步的。
3.修饰代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象,他的同步效果和修饰普通方法一样。
4.修饰类:其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象。(同步效果和静态方法类似)
synchronized方法控制范围较大,它会同步对象中所有synchronized方法的代码。synchronized代码块控制范围小,他只会同步代码块中的代码。
三、示例
有如下两个类:
class A{
public synchronized void a(){
}
public synchronized void b(){
}
}
class A{
public static synchronized void a(){
}
public static synchronized void b(){
}
}
创建两个对象:
A a1 = new A();
A a2 = new A();
在两个线程中并发访问:
Thread1:a1.a(); Thread2:a2.a();
第一种情况不可以同步,因为锁的是对象;第二种可以同步,因为锁的是类。