package springcloud.controller;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.ReentrantLock;
public class Jmm07 {
private static int total = 0;
private static Object object = new Object();
private static ReentrantLock lock = new ReentrantLock();//显示锁
public static void main(String[] args) throws Exception {
final CountDownLatch countDownLatch = new CountDownLatch(1);
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
countDownLatch.await();//等到其他线程执行完毕
for (int j = 0; j < 1000; j++) {
synchronized (object) {//内置锁、隐式锁
total++;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}).start();
Thread.sleep(50);
countDownLatch.countDown();
Thread.sleep(200);
}
System.out.println(total);
}
}
- 在1.6之后,对象锁偏向锁(针对单线程)
- 对象锁轻量级锁(针对多线程,但线程竞争不激烈(锁的时间占用端,可以多线程可以交替执行)),内部循环执行,会一直占着cpu(spin)
- 占着cpu执行的时间比重新唤醒线程的效率要高
- 但是循环的次数是有限制的,比如while设置为100,则锁进行升级(说明竞争激烈,要释放锁)
- synchronized 锁的升级过程是不可逆的
- ReentrantLock 和synchronized 区别不大
以下是synchronized 锁加的地方
package springcloud.controller;
import java.util.concurrent.locks.ReentrantLock;
public class Jmm08 {
//修饰静态方法
private static int total = 0;
private static Object object = new Object();
private static ReentrantLock lock = new ReentrantLock();//显示锁
public static void main(String[] args) {
Jmm08.decrStock();
}
static int stock;
public static synchronized void decrStock() {
//加锁加在Jmm08这个对象上
System.out.println(stock);
}
}
package springcloud.controller;
import java.util.concurrent.locks.ReentrantLock;
public class Jmm09 {
//修饰非静态方法
private static ReentrantLock lock = new ReentrantLock();//显示锁
public static void main(String[] args) {
new Jmm09().decrStock();
}
static int stock;
public synchronized void decrStock() {
//加锁加在this对象上
System.out.println(stock);
}
}
package springcloud.controller;
public class Jmm10 {
private static Object object = new Object();
//加在方法内部
public static void main(String[] args) {
new Jmm10().decrStock();
}
static int stock;
public synchronized void decrStock() {
//方法内部加同步块
synchronized (object) {
if (stock <= 0) {
System.out.println("库存为0");
} else {
System.out.println(stock);
}
}
}
}



