1)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟悉。这个多线程问题比较简单,可以用join方法实现。
----join():等待该线程结束,才能执行其他线程。
2)在Java中Lock接口比synchronized块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
lock接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像ConcurrentHashMap这样的高性能数据结构和有条件的阻塞。Java线程面试的问题越来越会根据面试者的回答来提问。我强烈建议在你去参加多线程的面试之前认真读一下Locks,因为当前其大量用于构建电子交易终统的客户端缓存和交易连接空间。
Lock接口相比于synchronized块具有以下优势:
显式控制锁的获取和释放:Lock接口提供了显式的lock()方法用于获取锁,并提供了unlock()方法用于释放锁。相比于synchronized块,Lock接口更灵活,可以在代码中明确地控制锁的获取和释放,可以灵活地选择在哪些位置获取和释放锁。
支持公平锁和非公平锁:Lock接口的实现类可以选择使用公平锁(FairLock)或非公平锁(NonfairLock)。公平锁保证等待时间最长的线程最先获取锁,避免线程饥饿;而非公平锁则允许插队获取锁,可能导致某些线程长时间等待。而synchronized关键字只能使用非公平锁。