若想解决线程安全问题,需要将线程异步操作变成同步操作。Java 提供了一种内置的锁机制。synchronized 关键字就是 Java 中的同步锁。
synchronized 使用方法:
1.synchronized 修饰非静态方法:同步方法
2.synchronized 修饰静态方法:静态方法锁
3.synchronized 修饰块:同步块锁
线程进入同步代码块之前,会自动获得锁,并且在退出同步代码块的时候会自动释放锁。
无论是通过正常结束,还是通过抛异常结束,都一样释放锁。
即多个线程不能“同时”执行该方法,只能先后顺序的同步执行。这样就会导致该方法从多线程异步操作编程同步操作,简介的解决了线程并发操作所带带来的线程问题。
当方法上使用 synchronized,那么上锁的对象就是当前方法所属的对象也就是 this
4.当一个静态方法上面用 synchronized 修饰,该方法称为静态方法锁。那么该方法锁的对象是当前方法所属的类的对象,即 Class 的实例,每个类有且仅有一个 Class 实例,在该 Class 内部记录了这个类的信息。
5.同步块,使用同步块可以更精确的控制需要执行的代码片段。
可以保证在并发安全的前提下,有效的缩小同步范围,尽可能地提高并发效率。
同步块需要自行制定“同步监视器”,即上锁的对象。
必须保证多个需要同步执行的线程看到的是同一个对象。
通常是 this。
互斥锁
当 synchronized 修饰几段不同代码时,但是同步监视器对象相同时,那么这几段代码就存在互斥关系。即多个线程不能同时执行这几段代码。