1)现在有 T1、T2、T3 三个线程,你怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后执行?
- 这个线程问题通常会在第一轮或电话面试阶段被问到,目的是检测你对”join”方法是否熟
悉。这个多线程问题比较简单,可以用 join 方法实现。
2)在 Java 中 Lock 接口比 synchronized 块的优势是什么?你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
lock 接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写像
ConcurrentHashMap 这样的高性能数据结构和有条件的阻塞。
1 import java.text.SimpleDateFormat;
2 import java.util.Date;
3 import java.util.Random;
4 import java.util.concurrent.locks.ReadWriteLock;
5 import java.util.concurrent.locks.ReentrantReadWriteLock;
6
7
8
9
10 public class JoinTest2 {
11
12 public static void main(String[] args) {
13 final TheData theData = new TheData();
14 for(int i=0;i<4;i++){
15 new Thread(new Runnable() {
16 @Override
17 public void run() {
18 theData.get();
19 }
20 }).start();
21 }
22 for(int i=0;i<4;i++){
23 new Thread(new Runnable() {
24 @Override
25 public void run() {
26 theData.put(new Random().nextInt(1000));
27 }
28 }).start();
29 }
30 }
31
32
33 }
34
35 class TheData{
36 private Integer data = 0;
37 private ReadWriteLock rwLock = new ReentrantReadWriteLock();
38 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
39 public void get(){
40 rwLock.readLock().lock();//读锁开启,读进程均可进入
41 try{
//用try finally来防止因异常而造成的死锁
42 System.out.println(Thread.currentThread().getName()+"read lock is ready.."+sdf.format(new Date()));
43 Thread.sleep(1000);
44 System.out.println(Thread.currentThread().getName()+"read data is"+data);
45 }catch (InterruptedException e) {
46 e.pri