synchronized 作用
synchronized 关键字是 Java 并发编程中线程同步的常用手段之一。

1.1 作用:

确保线程互斥的访问同步代,锁自动释放,多个线程操作同个代码块或函数必须排队获得锁,
保证共享变量的修改能够及时可见,获得锁的线程操作完毕后会将所数据刷新到共享内存区;
不解决重排序,但保证有序性。
1.2 用法:

修饰实例方法synchronized 关键词作用在方法的前面,用来锁定方法,其实默认锁定的是 this 对象。
由浅入深,Java 并发编程中的 Synchronized(一)

修饰静态方法synchronized 还是修饰在方法上,不过修饰的是静态方法,等价于锁定的是 Class 对象。
由浅入深,Java 并发编程中的 Synchronized(一)
修饰代码块用法是在函数体内部对于要修改的参数区间用 synchronized 来修饰,相比与锁定函数这个范围更小,可以指定锁定什么对象。
由浅入深,Java 并发编程中的 Synchronized(一)
总结:

synchronized 修饰的实例方法,多线程并发访问时,只能有一个线程进入,获得对象内置锁,其他线程阻塞等待,但在此期间线程仍然可以访问其他方法。
synchronized 修饰的静态方法,多线程并发访问时,只能有一个线程进入,获得类锁,其他线程阻塞等待,但在此期间线程仍然可以访问其他方法。
synchronized 修饰的代码块,多线程并发访问时,只能有一个线程进入,根据括号中的对象或者是类,获得相应的对象内置锁或者是类锁
每个类都有一个类锁,类的每个对象也有一个内置锁,它们是互不干扰的,也就是说一个线程可以同时获得类锁和该类实例化对象的内置锁,当线程访问非 synchronzied 修饰的方法时,并不需要获得锁,因此不会产生阻塞。