synchronized原理
Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的互斥锁(Mutex Lock)来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。这种依赖于操作系统互斥锁(Mutex Lock)所实现的锁我们称之为“重量级锁”
synchronized用法
1 | /*获取对象锁*/ |
两个代码块的互斥
1 | public void do1() { |
创建一个实例,开启两个线程,分别调用do1(),do2()方法,这两个方法也是互斥的,即使访问的是两个线程访问的是两个方法,也是互斥的,因为决定是否同时访问的是根据对象锁来的,这两个调用使用的是同一个对象锁
#总结
synchronized关键字加在方法上还是对象上,如果它作用的对象是非静态的,则它取得的锁是对象;如果synchronized作用的对象是一个静态方法或一个类,则它取得的锁是对类,该类所有的对象同一把锁。