![Synchronized](http://www.eleven-smile.com/usr/uploads/2022/01/3453431328.png)

一、Synchronized简介

synchronized 意为 “同步”,在JAVA中是一个关键字,专业术语称之为 “同步锁”,因为synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行,起到一个锁的作用。

二、Synchronized的使用场景

1、修饰实例方法

public class Sync1 {
    /**
     * 修饰实例方法
     * @author eleven-smile
     * @date 2022/1/2 20:36
     */
    public synchronized void process(){
        //TODO
        System.out.println("eleven-smile.com");
    }
}

解析: synchronized修饰实例方法,对当前实例对象this加锁,进入同步代码前要获得当前实例对象this的锁。

2、修饰静态方法

public class Sync2 {
    /**
     * 修饰静态方法
     * @author eleven
     * @date 2022/1/2 20:40
     */
    public void process(){
        synchronized (Sync2.class){
            //TODO
            System.out.println("eleven-smile.com");
        }
    }
}

解析: synchronized修饰静态方法,对当前类的Class对象加锁,进入同步代码前要获得当前类的Class对象的锁。

3、修饰代码块

public class Sync3 {
    /**
     * 修饰代码块
     * @author eleven
     * @date 2022/1/2 20:44
     */
    public void process(){
        //TODO
        System.out.println("代码块前:eleven-smile.com");
        //代码块
        synchronized (new Object()){
            //TODO
            System.out.println("eleven-smile.com");
        }
    }
}

解析: synchronized修饰代码块,对指定加锁对象(示例代码中是new Object()),进入同步代码前要获得给定对象的锁。

不同的修饰类型,代表锁的粒度随之不同

二、Synchronized如何实现加锁?

三、Synchronized如何做到有序性、可见性、原子性呢?

1、原子性

所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

如:SynchronizedLockAtomicXXX

2、可见性

可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。

如:SynchronizedVolatile

3、有序性

有序性值程序执行的顺序按照代码先后执行。

如:SynchronizedVolatile

四、Synchronized如何锁升级呢?