synchronized是java的关键字(内置的),Lock是java的接口。两者都实现了对于临界资源的同步互斥访问,各有优缺点。
1.简介
synchronized的使用对象主要有两大类:
- 静态:类、类方法。
- 非静态:对象,对象方法。
当多个线程访问了同一个被synchronized修饰的内容时,只有最先获取该内容的锁,其他线程只能等待该线程释放锁(等待或结束)后才能获取该内容的锁。也就是该内容在一段时间内只能被一个线程所拥有。
线程释放锁的情况有三种:
- 正常执行完被锁的内容,线程释放锁
- 执行被锁的内容时发生异常,JVM释放锁
- 进入等待状态(调用wait()方法等),线程释放锁
2.使用
2.1 作用于对象
//代码块
synchronized(this){
//...
}
//指定对象
synchronized(obj){
//...
}
//特殊对象,没有明确对象时
private byte[] lock = new byte[0];//特殊对象
......
synchronized(lock){
//...
}
2.2 作用于方法
//对象方法
public synchronized void method(){
//...
}
或
public synchronized void method(){
synchronized(this){
//...
}
}
//静态方法
public synchronized static void method(){
//...
}
2.3 作用于类
synchronized(Clazz.class){
//...
}
注意:
- synchronized无法被继承,被重写的方法无法同步,父类的方法是同步的。
- 修饰对象或对象方法时,只在该对象同步,该类的所有对象之间不保持同步。