2019-03-21

面试笔记(二)

今天遇到一个面试题
public static synchronize void a()
public synchronize void b()
问题:现在存在着两个方法,如果线程A开始执行方法a(),那么另一个线程是否可以执行方法b()?


我的想法:
static修饰的方法,synchronize关键词所用的锁为class对象
普通方法,synchronize关键词所用的锁为类对象
锁不一致,所用可以访问。


简单代码展示

public class TestThread1 {

    public static synchronized void a() throws InterruptedException {
        System.out.println("a执行开始-----");
        Thread.sleep(5000);
        System.out.println("a执行完成-----");
    }
    public synchronized void b() throws InterruptedException {
        System.out.println("b执行开始-----");
        Thread.sleep(5000);
        System.out.println("b执行完成-----");
    }

}

public class TestThread2 {

    public static void main(String[] args) {

      new Thread() {
            @Override
            public void run() {
                try {
                    TestThread1.a();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        new Thread(){
            @Override
            public void run() {
                try {
                    new TestThread1().b();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
        
    }

}

执行结果如下:


image.png

我的想法应该是正确的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,415评论 0 4
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,670评论 1 114
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 进程和线程 进程 所有运行中的任务通常对应一个进程,当一个程序进入内存运行时,即变成一个进程.进程是处于运行过程中...
    胜浩_ae28阅读 5,142评论 0 23
  • 本章解决问题: 1. 用户观察的作用: 1) 观察能够帮助你发现用户不愿意讨论的敏感信息,或者发现用户觉得理所应当...
    Joan_shallot阅读 1,245评论 0 0