牛客网Java面试问答每日一记3
作者:互联网
- 创建线程的几种方式?
- 概括性解释线程的几种状态
- 同步方法和同步代码块的区别
- 监视器内部如何做到线程同步?程序应该做到哪种级别的同步?
- 什么是死锁?
- 如何确保N个线程可以访问N个资源而又不导致死锁?
1:继承 Thread 类,重写/实现 run方法。 实现 Runnable 接口,实现 run方法。 实现 Callable 接口,重写 run 方法。 在程序中通过 Executor 框架实现创建线程
2:new 创建线程对象 runnable 线程对象创建完毕执行start方法后处于 runnable 状态 block 阻塞状态,等待对象的内置锁 waiting 等待状态,等待其他线程 time_waitting 有时间限制的等待其他线程
dead 死亡状态,线程任务执行完毕,线程死亡
3:同步方法锁住了一个方法(静态方法则锁住了一个类),需要当前对象(类对象)的锁,同步代码块只是锁住了一块代码,可以随意选择什么作为锁
4:监视器和锁在Java虚拟机中是一块使用的,监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联,线程在获取锁之前不允许执行同步代码
5:两条或多条线程彼此互相堵塞,在没有外力的情况下无法继续执行的现象叫做死锁
6:造成死锁的条件有四个:互斥性,不可剥夺性,资源持续获取与保存,形成一个资源获取闭环。如要不形成死锁从以上四个方面入手即可。
其中互斥性不可消除,线程资源不可剥夺行破坏成本大,不推荐使用只需从另外两个入手即可。
保证线程使用完资源后及时释放即可保证另一条线程获取资源的顺利运行。另外可以对线程访问资源安排顺序,这样就打破了线程访问资源闭环,也不会形成死锁
标签:同步,Java,代码,死锁,牛客,一记,线程,监视器,资源 来源: https://www.cnblogs.com/chensang21930/p/15415528.html