参考链接:https://blog.csdn.net/weiyongxuan/article/details/46493803
https://blog.csdn.net/qq_34902522/article/details/76262812先来了解几个定义:
临界区:Critical Section
临界区是一个用以访问共享资源的代码块,这个代码块在同一时间内只允许一个线程执行。
同步:
1、当一个线程试图访问一个临界资源时,它将使用一种同步机制来查看是不是已经有其他的线程进入临界区。
2、如果临界区没有其他的线程,他就可以进入临界区。如果已经有线程进入临界区,它就被同步机制挂起,直到进入的线程离开临界区。
3、如果在等待临界区的线程不只一个,jvm就会选择其中一个,其他的继续等待。
java采用两种基本的同步机制:
一种是:synchronized关键字机制
另一种是:lock接口及其实现
synchronize关键字机制
synchronize修饰方法
1、使用synchronize关键字的方法性能比较低
2、每一个使用synchronize修饰的方法都是临界区
3、使用synchronize修饰的对象,那么同一时间只能有一个执行线程访问,如果其他线程试图访问这个对象的其他方法,都将被挂起
4、synchronize修饰静态方法会怎么样?
使用synchronize修饰的静态方法,那么同一时间只能有一个执行线程访问,但是其他线程可以访问这个对象的非静态方法。
synchronize修饰代码块
1、方法的其余部分保持在synchronize代码块之外,以获取更好的性能
2、synchronized修饰代码块的参数是当前对象,注意是对象,不是类
1、java中每个对象都有同步锁,同步方法是指进入该方法时需要获取this对象的同步锁,而同步代码块则是可以指定需要获取哪个对象的同步锁
2、无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――同步方法很可能还会被其他线程的对象访问