Synchronized关键字用于对Java对象、方法、代码块等提供线程安全操作。Synchronized属于独占式的悲观锁机制,同时也是可重入锁。我们在使用Synchronized关键字的时候,可以保证同一时刻只有一个线程对该对象进行访问;也就是说它在同一个JVM中是线程安全的。
Java中的每个对象都有一个monitor对象,加锁就是再竞争monitor对象。代码块加锁是通过在代码块前后分别加上monitorenter和monitorexit指令实现。方法加锁则是通过一个标记位来进行判断。
Synchronized 的作用范围
- synchronized 作用于成员变量和非静态方法的时候,锁住的是对象实例本身,也就是this对象。
- synchronized 作用于静态方法的时候,锁住的是Class实例,因为静态方法属于Class而不属于对象。
- synchronized 作用于一个代码块的时候,锁住的是所有代码块中配置的对象。
Synchronized 用法
public class SynchronizedDemo {
public static void main(String[] args) {
final SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo.generalMethod1();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
synchronizedDemo.generalMethod2();
}
}).start();
}
// synchronized 关键字修饰普通的同步方法,锁住的是当前实例对象
public synchronized void generalMethod1(){
try {
for (int i = 0; i < 3; i++) {
System.out.println("generalMethod1 execute "+i+" time");