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() {@Overridepublic void run() {synchronizedDemo.generalMethod1();}}).start();new Thread(new Runnable() {@Overridepublic 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");