synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块
image.png打上断点,多次请求这个方法,我们加上锁了,在这个断点处按f8跑完,synchrronize如果生效你就会感受到明显的停顿后才会进入断点,去掉synchrronize后,多次请求这个方法,是不能在断点处感受到明显的停顿,就证明没有加锁
lock是jdk1.5出的一个接口
@Slf4j
public class AddressControllerTest {
private Lock lock = new ReentrantLock();
//需要参与同步的方法
private void method(Thread thread){
lock.lock();
try {
log.info("线程名"+thread.getName() + "获得了锁");
}catch(Exception e){
e.printStackTrace();
} finally {
log.info("线程名"+thread.getName() + "释放了锁");
lock.unlock();
}
}
public static void main(String[] args) {
AddressControllerTest lockTest = new AddressControllerTest();
//线程1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
lockTest.method(Thread.currentThread());
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
lockTest.method(Thread.currentThread());
}
}, "t2");
t1.start();
t2.start();
}
}
运行结果
线程名t1获得了锁
线程名t1释放了锁
线程名t2获得了锁
线程名t2释放了锁
拿到锁才有执行权
网友评论