多线程的面试问题

怎么保证线程按照顺序执行

使用Thread的join方法(等待这个线程结束,也就是说当前线程等待这个线程结束后再继续执行

可以一个一个的创建

 

怎么判断所有线程执行完成

使用countDownLatch,执行完一个线程countDown一下,在主线程中await

 

 

线程安全的解决方式

1、同步代码块 synchronize(同步监视器){}
2、同步方法,synchronized
3、lock方法
这两种方式都涉及到同步监视器,静态同步方法的监视器是当前类本身
非静态的是this,synchronize(this){}
synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置
同步方法中是ACC_SYNCHRONIZED

 

Lock
new ReentrantLock(false)
false:非公平锁,线程间执行顺序是乱序
true:公平锁,线程间执行顺序是顺序
lock要手动释放锁(unLock方法)

 

wait、notify、notifyAll
wait:一旦执行该方法,当前线程就会进入阻塞状态,并释放同步监视器
notify:一旦执行该方法,就会唤醒被wait的线程,如果有多个,就会唤醒优先级高的
notifyAll:唤醒所有被wait的

 

sleep和wait的区别
相同:都会阻塞当前线程
不同:①sleep是Thread中的,wait是Object的
②sleep可以在任何需要的场景下执行,wait必须在同步代码块中执行
③sleep不会释放同步监视器,wait会

 

synchronized 依赖于 JVM 而 ReentrantLock 依赖于 API
相比synchronized,ReentrantLock增加了一些高级功能。主要来说主要有三点:①等待可中断;②可实现公平锁;③可实现选择性通知(锁可以绑定多个条件)④等待超时
synchronized关键字与wait()和notify()/notifyAll()方法相结合可以实现等待/通知机制
ReentrantLock类结合ReentrantLock.newCondition()实例可以实现“选择性通知”condition.awaite()  condition.signal()
tryLock(long time, TimeUnit unit)获取锁的等待时间(解决死锁的问题)

posted @ 2023-02-08 21:55  sugarstar  阅读(28)  评论(0)    收藏  举报