java多线程-JUC-Look到底锁了谁?
demo
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestReentrantLock extends Thread {
private static DB db = new DB();
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
db.add();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
db.buy();
db.buy();
}
}).start();
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
new TestReentrantLock().start();
}
}
}
class DB {
private Lock lock = new ReentrantLock();
private Lock lock_add = new ReentrantLock();
int i = 100;
public void buy() {
lock.lock();
try{
System.out.println("购买:"+(--i));
} finally {
lock.unlock();
}
}
public void add() {
lock.lock();
try{
System.out.println("进货:"+(++i));
} finally {
lock.unlock();
}
}
public void buyNoLook() {
i--;
System.out.println(i);
}
}
总结
- 实例中 class DB 代表数据库
- 多个线程同时 去 增加库存 和 减少库存.用 look 去锁;
- 必须只能使用 look 一个锁实例;如果 用 lock_add 和 look混搭使用,无效果;
- 可以看出 所有线程去调用 look.look()方法时,会产生同步制约(内部是自旋)效果;实质上是所有线程执行到 look.look()方法是,都会去获得 state值;