锁的重入

简介: 锁的重入package demo;/* * synchronized的重入 * 关键字synchronized拥有锁重入得功能, * 当一个线程得到了一个对象的锁后,再次请求次对象时时可以再次得到该对象的锁。

锁的重入

package demo;

/*  
 * synchronized的重入
 * 关键字synchronized拥有锁重入得功能,
 * 当一个线程得到了一个对象的锁后,再次请求次对象时时可以再次得到该对象的锁。
 * 
 * 
 * 
 * */
public class MyDubbo {

    //在synchronized 方法一种调用synchronized 方法2,
    //方法2中又调用方法3
    public synchronized void method1(){
        System.out.println("method1....");
        method2();
    }

    public synchronized void method2(){
        System.out.println("method2....");
        method3();
    }

    public synchronized void method3(){
        System.out.println("method3....");
    }

    public static void main(String[] args) {

        final MyDubbo my1 = new MyDubbo();
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                my1.method1();
            }
        });

        //synchronized的重入  表面上看是三个方法都synchronized,以为要method1执行获取锁对象后,
        //执行完毕后,method2才能获取锁对象。事实不是这样的,synchronized重入
        //将三个方法的synchronized都去掉,结果一样,但是机制不一样。
        t1.start();
    }
}

子父类的重入

package demo;

/*
 * 子类父类之间的重入是可行的。
 * 
 *  重入得异常的捕捉。一定要考虑整体问题,处理异常。
 * */
public class MyDubbo2 {

    static class Main{
        public int num = 10 ;
        public synchronized void operationMainSup(){

            try {
                num--;
                System.out.println("Main print num = " + num );
                Thread.sleep(100);

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    static class Sub extends Main{
        public synchronized void operationSubSup() {
            try {
                while(num>0){
                    num--;
                    System.out.println("Sub print num = " + num );
                    Thread.sleep(100);
                    //父类中的方法
                    this.operationMainSup();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                Sub sub = new Sub();
                sub.operationSubSup();
            }
        });

        //开始线程
        t1.start();
    }
}
相关文章
|
传感器 供应链 监控
数字化应用场景
数字化应用场景
532 0
|
9月前
|
机器学习/深度学习 数据可视化 TensorFlow
使用Python实现深度学习模型的分布式训练
使用Python实现深度学习模型的分布式训练
385 73
阿里云的证书有什么用?含金量怎么样?
对于我们现在的社会来说,想找一份好工作,就必须要有足够的能力,尤其是在IT行业中,想要得到认可,最需要的就是有能够证明自己能力的东西。
阿里云的证书有什么用?含金量怎么样?
|
机器人 开发工具 C++
探究--gazebo里 关节是如何动起来的____撸源码探究ros gazebo里的 硬件抽象构建
探究--gazebo里 关节是如何动起来的____撸源码探究ros gazebo里的 硬件抽象构建
探究--gazebo里 关节是如何动起来的____撸源码探究ros  gazebo里的 硬件抽象构建
|
人工智能 弹性计算 运维
与生命赛跑,阿里云Serverless容器助力越光医疗提升心电图AI诊断效率90%
一些本是极为隐秘且凶险的病症,在新技术发展下,也将无所遁形。
与生命赛跑,阿里云Serverless容器助力越光医疗提升心电图AI诊断效率90%
|
存储 安全 固态存储
All In All-Flash,阿里云入门级ESSD云盘重磅发布
此次全新发布的ESSD PL0 采用NVMe存储介质,最大程度上释放阿里云的技术红利。这也是业内唯一一款基于“RDMA网络架构+NVMe存储介质”的入门级云盘
All In All-Flash,阿里云入门级ESSD云盘重磅发布
|
机器学习/深度学习 TensorFlow 算法框架/工具
全图化引擎(AI·OS)中的编译技术
全图化引擎又称算子执行引擎,它的介绍可以参考从HA3到AI OS -- 全图化引擎破茧之路。本文从算子化的视角介绍了编译技术在全图化引擎中的运用。主要内容有: 通过脚本语言扩展通用算子上的用户订制能力,目前这些通用算子包括scorer算子,filter算子等。
10900 0
|
流计算
详解 Flink DataStream中min(),minBy(),max(),max()之间的区别
详解 Flink DataStream中min(),minBy(),max(),max()之间的区别,但是事实上,min与max 也会返回整个元素。
1297 0
|
PHP 网络性能优化 网络协议
udp协议-看这篇就够了
UDP 概述 用户数据报协议 UDP 只在 IP 的数据报服务之上增加了很少一点的功能,这就是复用和分用的功能以及查错检测的功能 UDP 的主要特点 UDP 是无连接的,即发送数据之前不需要建立连接(发送数据结束时也没有连接可释放),减少了开销和发送数据之前的时延 UDP 使用尽最大努力交付,即不保证可靠交付,主机不需要维持复杂的连接状态表 UDP 是面向报文的,发送方的 UDP 对应用程序交下来的报文,在添加首部后就向下交付 IP 层。
2928 0

热门文章

最新文章