• 2.1.6synchronized锁重入


    关键字在使用synchronized时,当线程得到一个对象锁时,这时这个线程再次请求此对象锁是可以拿到的,也就说明同步方法之间是可以进行互相调用的,

     1 package com.cky.bean;
     2 
     3 /**
     4  * Created by chenkaiyang on 2017/12/5.
     5  */
     6 public class Service {
     7    synchronized public void service1() {
     8         System.out.println("service1");
     9         service2();
    10     }
    11 
    12     synchronized public void service2() {
    13         System.out.println("service2");
    14         service3();
    15     }
    16 
    17     synchronized public void service3() {
    18         System.out.println("service3");
    19     }
    20 }
     1 package com.cky.thread;
     2 
     3 import com.cky.bean.Service;
     4 
     5 /**
     6  * Created by chenkaiyang on 2017/12/5.
     7  */
     8 public class MyThread extends Thread{
     9     @Override
    10     public void run() {
    11         super.run();
    12         Service service = new Service();
    13         service.service1();
    14     }
    15 }
    package com.cky.test;
    
    import com.cky.thread.MyThread;
    
    /**
     * Created by chenkaiyang on 2017/12/2.
     */
    public class Test {
        public static void main(String[] args){
            MyThread myThread = new MyThread();
            myThread.start();
    
        }
    }
    D:itjdk1.8injava -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:itideaIntelliJ IDEA 2016.3.3in" -Dfile.encoding=UTF-8 -classpath "D:itjdk1.8jrelibcharsets.jar;D:itjdk1.8jrelibdeploy.jar;D:itjdk1.8jrelibextaccess-bridge-64.jar;D:itjdk1.8jrelibextcldrdata.jar;D:itjdk1.8jrelibextdnsns.jar;D:itjdk1.8jrelibextjaccess.jar;D:itjdk1.8jrelibextjfxrt.jar;D:itjdk1.8jrelibextlocaledata.jar;D:itjdk1.8jrelibext
    ashorn.jar;D:itjdk1.8jrelibextsunec.jar;D:itjdk1.8jrelibextsunjce_provider.jar;D:itjdk1.8jrelibextsunmscapi.jar;D:itjdk1.8jrelibextsunpkcs11.jar;D:itjdk1.8jrelibextzipfs.jar;D:itjdk1.8jrelibjavaws.jar;D:itjdk1.8jrelibjce.jar;D:itjdk1.8jrelibjfr.jar;D:itjdk1.8jrelibjfxswt.jar;D:itjdk1.8jrelibjsse.jar;D:itjdk1.8jrelibmanagement-agent.jar;D:itjdk1.8jrelibplugin.jar;D:itjdk1.8jrelib
    esources.jar;D:itjdk1.8jrelib
    t.jar;F:springboot	hreaddemooutproduction	hreaddemo;D:itideaIntelliJ IDEA 2016.3.3libidea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
    service1
    service2
    service3
    
    Process finished with exit code 0

    可重入锁的概念:

    自己可以再次获取自己的内部锁,譬如有一条线程获得了某个对象的对象锁,此时这个对象锁还没释放,当其要再次获得这个对象锁的时候还能获取,如果不能获取,则会造成死锁。

    package com.cky.bean;
    
    /**
     * Created by chenkaiyang on 2017/12/5.
     */
    public class Father {
        public int i=10;
        synchronized public void opeFatherMethod() {
            try {
                i--;
                System.out.println("main print i=" + i);
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    package com.cky.bean;
    
    /**
     * Created by chenkaiyang on 2017/12/5.
     */
    public class Son extends  Father{
        synchronized  public void opereSonMethod(){
            try {
                while(i > 0) {
                    i--;
                    System.out.println("sub print i="+i);
                    Thread.sleep(2000);
                    this.opeFatherMethod();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    package com.cky.thread;
    
    import com.cky.bean.Son;
    
    /**
     * Created by chenkaiyang on 2017/12/5.
     */
    public class MyThread extends Thread{
        @Override
        public void run() {
            super.run();
            Son service = new Son();
            service.opereSonMethod();
        }
    }
    package com.cky.test;
    
    import com.cky.thread.MyThread;
    
    /**
     * Created by chenkaiyang on 2017/12/2.
     */
    public class Test {
        public static void main(String[] args){
            MyThread myThread = new MyThread();
            myThread.start();
    
        }
    }
    D:itjdk1.8injava -Didea.launcher.port=7536 "-Didea.launcher.bin.path=D:itideaIntelliJ IDEA 2016.3.3in" -Dfile.encoding=UTF-8 -classpath "D:itjdk1.8jrelibcharsets.jar;D:itjdk1.8jrelibdeploy.jar;D:itjdk1.8jrelibextaccess-bridge-64.jar;D:itjdk1.8jrelibextcldrdata.jar;D:itjdk1.8jrelibextdnsns.jar;D:itjdk1.8jrelibextjaccess.jar;D:itjdk1.8jrelibextjfxrt.jar;D:itjdk1.8jrelibextlocaledata.jar;D:itjdk1.8jrelibext
    ashorn.jar;D:itjdk1.8jrelibextsunec.jar;D:itjdk1.8jrelibextsunjce_provider.jar;D:itjdk1.8jrelibextsunmscapi.jar;D:itjdk1.8jrelibextsunpkcs11.jar;D:itjdk1.8jrelibextzipfs.jar;D:itjdk1.8jrelibjavaws.jar;D:itjdk1.8jrelibjce.jar;D:itjdk1.8jrelibjfr.jar;D:itjdk1.8jrelibjfxswt.jar;D:itjdk1.8jrelibjsse.jar;D:itjdk1.8jrelibmanagement-agent.jar;D:itjdk1.8jrelibplugin.jar;D:itjdk1.8jrelib
    esources.jar;D:itjdk1.8jrelib
    t.jar;F:springboot	hreaddemooutproduction	hreaddemo;D:itideaIntelliJ IDEA 2016.3.3libidea_rt.jar" com.intellij.rt.execution.application.AppMain com.cky.test.Test
    sub print i=9
    main print i=8
    sub print i=7
    main print i=6
    sub print i=5
    main print i=4
    sub print i=3
    main print i=2
    sub print i=1
    main print i=0
    
    Process finished with exit code 0

    结果说明:当存在父子类继承关系时,子类完全可以通过可重入锁调用父类同步方法

  • 相关阅读:
    python -- twisted初探
    python -- redis连接与使用
    redis使用
    python -- 异步编程
    python
    python
    福大软工 · 最终作业
    福大软工 · 第十二次作业
    Beta 冲刺(7/7)
    Beta 冲刺(6/7)
  • 原文地址:https://www.cnblogs.com/edison20161121/p/7967435.html
Copyright © 2020-2023  润新知