synchronized是 Java 编程语言中的一个关键字,用于提供线程同步。在多线程编程中,synchronized可以确保在同一时间只有一个线程可以访问受保护的代码区域,从而避免数据的不一致性和其他并发问题。
synchronized关键字通常使用在下面四个地方:
//修饰实例方法,锁的实例对象
public synchronized void demo1() {
System.out.println("junfeng");
}
//修饰静态方法,锁的类对象
public synchronized static void demo2() {
System.out.println("junfeng");
}
public void demo3() {
//锁的实例对象
synchronized (this) {
System.out.println("junfeng");
}
}
public void demo4() {
//锁的类对象
synchronized (SychronizedTest.class) {
System.out.println("junfeng");
}
}
public static void main(String[] args) {
for (int i = 0; i < 7; i++) {
MyThread myThread = new MyThread();
Thread thread = new Thread(myThread);
thread.start();
}
}
package com.junfeng.manage.test;
public class MyThread implements Runnable {
@Override
public void run() {
printTest();
}
private synchronized void printTest() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + "~~~~" + System.currentTimeMillis());
}
}
打印结果:
Thread-6~~~~1697077107016
Thread-0~~~~1697077107016
Thread-5~~~~1697077107016
Thread-2~~~~1697077107016
Thread-3~~~~1697077107016
Thread-4~~~~1697077107016
Thread-1~~~~1697077107016
上面代码执行一下子就打印出结果,说明多个线程之间是没有阻塞的。若是将printTest方法改成静态方法
package com.junfeng.manage.test;
public class MyThread implements Runnable {
@Override
public void run() {
printTest();
}
private synchronized static void printTest() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName() + "~~~~" + System.currentTimeMillis());
}
}
打印结果:
Thread-0~~~~1697078155367
Thread-6~~~~1697078156382
Thread-5~~~~1697078157383
Thread-4~~~~1697078158385
Thread-3~~~~1697078159387
Thread-2~~~~1697078160395
Thread-1~~~~1697078161401
发现打印每个一秒打印一次,说明线程之间是阻塞的。
综上代码执行结果,说明sychronized修饰普通方法时,其修饰的是方法实例对象;而sychronized修饰静态方法时,其修饰的为类对象。
同上同理,sychronized修饰this时,其修饰的是方法实例对象;而sychronized修饰MyThread.class时,其修饰的为类对象。
在Java中,synchronized锁的升级是指锁的状态从无锁状态逐渐升级为偏向锁、轻量级锁和重量级锁的过程。
首先看看32位JVM中Mark Word存储结构:
sychronized锁升级详细过程如下图:
synchronized升级过程中有2次自旋。