验证锁的存在

2018-10-11  本文已影响0人  setone

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释放了锁

拿到锁才有执行权

上一篇 下一篇

猜你喜欢

热点阅读