美文网首页
1.9 一个同步方法是否可以调用另外一个同步方法?

1.9 一个同步方法是否可以调用另外一个同步方法?

作者: 殊胜因缘_Chris | 来源:发表于2019-03-02 22:27 被阅读0次
/**
 * This is description.
 * 一个同步方法是否可以调用另外一个同步方法?
 * 一个线程已经拥有某个对象的锁, 再次申请时, 是否还会得到该对象的锁?
 * 结论: 同一个线程执行, synchronized获取的锁是可重入的.(详见: <Java并发编程实战> P21)
 * 思考: 写一个程序模拟死锁.
 * @author Chris Lee
 * @date 2019/3/2 18:16
 */
public class Demo {
    /**
     * 同步方法fun1.
     */
    public synchronized void fun1() {
        System.out.println("当前线程: " + Thread.currentThread().getName() + ", fun1.");
        fun2();
    }

    /**
     * 同步方法fun2.
     */
    private synchronized void fun2() {
        System.out.println("当前线程: " + Thread.currentThread().getName() + ", fun2.");
    }

    public static void main(String[] args){
        Demo demo = new Demo();
        new Thread(() -> demo.fun1()).start();
        /*
            当前线程: Thread-0, fun1.
            当前线程: Thread-0, fun2.
         */
    }
}
思考:
  • 模拟死锁:
/**
 * This is description.
 * 模拟死锁.
 * 思路:
 * 1. 两个线程t1, t2, 两个锁对象o1, o2.
 * 2. 在t1运行时先将o1加锁, sleep一下, 发现o2已被t2加锁.
 * 3. 在t2运行时先将o2加锁, sleep一下, 发现o1已被t1加锁.
 * 结果: 死锁产生.
 *
 * @author Chris Lee
 * @date 2019/3/3 12:32
 */
public class DeadLock implements Runnable {

    /**
     * flag = 1时, 将o1加锁.
     * flag = 2时, 将o2加锁.
     */
    private int flag = 1;

    /**
     * 定义两个静态对象o1, o2.(注: 类初次加载时会被初始化.)
     */
    public static Object o1 = new Object();
    public static Object o2 = new Object();

    @Override
    public void run() {

        if (flag == 1) {
            synchronized (o1) {
                System.out.println(Thread.currentThread().getName() + "flag = 1, o1加锁.");

                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (o2) {
                    System.out.println("flag = 2, o2加锁. 如果未打印, 则死锁产生.");
                }
            }
        } else if (flag == 2) {
            synchronized (o2) {
                System.out.println(Thread.currentThread().getName() + "flag = 2, o2加锁.");

                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                synchronized (o1) {
                    System.out.println("flag = 1, o1加锁. 如果未打印, 则死锁产生.");
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock deadLock1 = new DeadLock();
        DeadLock deadLock2 = new DeadLock();

        deadLock1.flag = 1;
        deadLock2.flag = 2;

        new Thread(() -> deadLock1.run(), "线程t1: ").start();
        new Thread(() -> deadLock2.run(), "线程t2: ").start();
        /*
            线程t1: flag = 1, o1加锁.
            线程t2: flag = 2, o2加锁.
         */
    }
}

说明:
  • 本篇文章如有不正确或待改进的地方, 欢迎批评和指正, 大家一同进步, 谢谢!
  • 世上有4样东西可以让世界变得更美好, 它们是: 代码(Code), 诗(Poem), 音乐(Music), 爱(Love). 如有兴趣了解更多, 欢迎光顾"我的文集"相关文章.
资料:
  1. 学习视频: https://www.bilibili.com/video/av11076511/?p=1
  2. 参考代码: https://github.com/EduMoral/edu/tree/master/concurrent/src/yxxy
  3. 我的代码: https://github.com/ChrisLeejing/learn_concurrency.git

相关文章

  • 1.9 一个同步方法是否可以调用另外一个同步方法?

    思考: 模拟死锁: 说明: 本篇文章如有不正确或待改进的地方, 欢迎批评和指正, 大家一同进步, 谢谢! 世上有4...

  • 从一道面试题引申出的java锁机制原理

    面试题: 两个同步方法a、b,问在方法a中是否可以顺利访问方法b 答案:可以。 同步方法 同步方法是在方法签名上有...

  • 实战Java高并发程序设计笔记第一章

    相关术语 同步和异步 同步和异步用来形容一次方法调用。 同步:方法调用一旦开始,调用者必须等到方法调用结束后,才能...

  • 高并发编程基础

    1.同步方法锁定的是锁对应的其它同步方法,不影响调用非同步方法或其它锁对应的同步方法。 2.同步方法只能保证当前方...

  • 释放锁的三种情况

    1.执行完同步方法或同步代码块 2.在同步方法或同步代码块中调用wait方法 3.在同步方法或同步代码块中发生异常...

  • OKHttp的getResponseWithIntercepto

    同步请求中 同步请求中 不管同步/异步请求都调用了同一个方法 getResponseWithInterceptor...

  • 并发,你需要知道的几个概念

    同步(Synchronous)和异步(Asynchronous) 同步方法调用一旦开始,调用者必须等待方法调用返回...

  • 一次同步方法的失败与原因总结

    synchronized关键字可以设置同步方法和同步块,同步方法会对调用对象this上锁,所有线程进入前都需要获取...

  • 多线程基本概念

    1.同步&异步 同步和异步通常用来形容一次方法的调用。 同步方法一旦开始调用,调用者必须等待调用方法的返回,才能继...

  • 并发编程基础

    几个基本概念 同步&异步同步(Synchronous)同步方法一旦调用必须等待方法调用返回后才会继续后续行动异步(...

网友评论

      本文标题:1.9 一个同步方法是否可以调用另外一个同步方法?

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