一、synchronized方式
1、添加在静态方法上:则是对该class对象加锁,所以尽量不要在同一个类中添加多个synchronized方法,避免产生锁竞争导致的性能问题
2、添加在非静态方法上:则是对当前对象(this)加锁
3、同步代码块:括号中的对象加锁
二、原理
在JDK1.6之前,是直接加重量级锁,来实现互斥;任何一个对象都有一个monitor与之关联,当线程执行同步代码是,先去获取monitor,如果获取到monitor,则会执行当前代码,如果没有获取到,则会被挂起,挂起会放入monitor对象的对待队列中,等待被唤醒;(可以看下jvm源码的ObjectMonitor),monitor只能同时被一个线程获取;
因为直接加重量级锁,性能比较差,所以在JDK1.6之后,加了一个锁膨胀升级的机制;当对象被创建时,是无锁状态,当第一个线程获取锁时,锁升级为偏向锁,当第二个线程来竞争时,则变成轻量级锁(轻量级锁使用在线程交替执行同步代码块);如果并发场景时轻量级锁获取失败,则还会进行自旋锁进行优化,毕竟直接升级为重量级锁,线程需要从用户态切换为内核态系统层面来挂起线程,会先进行自旋,当竞争激烈时(自旋时间过长,一般也不会太长),则升级为重量级锁;
三、锁标识位
锁标识在对象头markWord