目录
1.synchronized特性
synchronized 是乐观锁,也是悲观锁,是轻量级锁(j基于自旋锁实现),也是重量级锁(基于挂起等待锁实现),它不是读写锁,是互斥锁,当一个线程抢到锁之后,其它线程阻塞等待,进入synchronized关键字修饰的代码块相当于加锁,出代码块相当于解锁.,它对同一锁对象加锁两次不会造成死锁,所以它是可重入锁,它加锁不遵循先来后到原则,所以是非公平锁.
2.synchronized如何使用
可以将一块修改操作变成原子的,需要有一个锁对象(相当于一个吉祥物),针对它进行加锁.示例代码如下,加锁方式分为两种:
① 方式一
//锁对象(继承自Object类的对象,不能是基本数据类型)
static Object o = new Object();
synchronized (o) {
if(flag == 0) {
System.out.println("a");
flag = -1;
o.notifyAll();
} else {
try {
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
② 方式二
//对++操作进行加锁(锁对象为this引用指向的对象)
synchronized public void add() {
count++;
}
3.synchronized的锁机制
如图,synchronized加锁先加的是偏向锁,简单来说,偏向锁就是标记了一下这个锁对象是哪个线程的,等发生锁竞争的时候,该线程立马就抢到这个锁,然后转变为轻量级锁(自适应的自旋锁),等锁竞争激烈起来的时候会转变为重量级锁.
注:自旋锁不停地死等,很浪费CPU资源,但是能第一时间抢到锁,但是自适应的自旋锁是等到一定的时间或者重试次数,就停止自旋.之后会总结锁策略的知识点.