美文网首页
锁对象改变引发的线程问题

锁对象改变引发的线程问题

作者: keepSwiming | 来源:发表于2017-06-23 16:24 被阅读14次

    Java多线程锁对象的改变

    用lock获取锁对象,当lock被修改以后,会产生是一把新的锁,另一个线程获取锁对象时会获取这把新的锁,导致线程异步执行.

    public class ChangeLock {
    
        private String lock = "lock";
        
        private void method(){
            System.out.println(Thread.currentThread().getName() + "开始"+"获取锁对象"+lock);
            synchronized (lock) {
                try {
                    System.out.println("当前线程 : "  + Thread.currentThread().getName() + "获得了"+"锁对象"+lock);
                    lock = "change lock";
                    Thread.sleep(2000);
                    System.out.println("当前线程 : "  + Thread.currentThread().getName() + "结束");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
        public static void main(String[] args) {
        
            final ChangeLock changeLock = new ChangeLock();
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    changeLock.method();
                }
            },"t1");
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    changeLock.method();
                }
            },"t2");
            t1.start();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t2.start();
        }
        
    }
    

    log信息

    //正常试验结果
    t1开始获取锁对象lock
    当前线程 : t1获得了锁对象lock
    t2开始获取锁对象change lock
    当前线程 : t2获得了锁对象change lock
    当前线程 : t1结束
    当前线程 : t2结束

    //sleep注销了的log信息
    t1开始获取锁对象lock
    t2开始获取锁对象lock
    当前线程 : t1获得了锁对象lock
    当前线程 : t1结束
    当前线程 : t2获得了锁对象change lock
    当前线程 : t2结束

    相关文章

      网友评论

          本文标题:锁对象改变引发的线程问题

          本文链接:https://www.haomeiwen.com/subject/hsvccxtx.html