Synchronized的特性
Synchronized是JAVA中实现线程安全的一个关键字,他可以应用于方法或者代码块中.当一个线程访问一个synchronized方法或者代码块时,它会自动获取方法会或者代码块的锁,并且再其他线程获取的这个锁之前将其阻塞.synchornized的作用是保证在多个线程在并发执行的时候,对共享资源的访问是有序的,避免了数据不一致或者冲突的情况,当一个线程执行synchronized代码时,其他线程必须等待该线程执行完毕,并且释放了锁才行.
Synchronized的使用方法
- 修饰静态方法,作用于类的class对象,进入修饰的静态方法前选需要获取类的class对象的锁.
- 修饰实例方法,作用于当前对象,进入代码前需要获得对象的锁.
- 修饰代码块,需要指定对象,在进入同步代码块前需要先获取指定对象的锁.
Synchronized的锁机制
- synchronized即是轻量级锁也是重量级锁.重量级是基于系统的互斥锁实现的;轻量级锁是基于自旋锁实现的.
- synchronized即是乐观锁也是悲观锁.
- synchronized是非公平锁
- synchronized是可重入锁
- synchronized不是读写锁
Synchronized锁的内部实现策略
当代码中写了一个synchronized之后,会产生一系列自适应过程(锁升级)
无锁 -- > 偏向锁 -->轻量级锁 -->重量级锁
偏向锁:对这个需要加锁的对象进行标记,当没有其他线程来竞争锁时就不上锁,一旦有其他线程来竞争锁时就立刻上锁.
当有更多的线程来竞争锁时,就升级为轻量锁,更加激烈后在升级为重量级锁.