Java中的线程实现方式
-
继承Thread类(Thread类实现了Runnable接口),重写run方法,通过thread调用start()方法。
-
实现Runnable接口,重写run方法。
-
实现Callable接口,重写call方法,配合FutureTask。FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Runnable接口。
悲观锁
认为坏事一定会发生,所以会先上锁。
乐观锁
认为坏事未必会发生,所以事后才上锁。
自旋锁:一种常见的乐观锁的实现
ABA问题:
0----8-----0
加上version版本号解决问题
保障CAS操作的原子性问题:
lock指令
读写锁,排他锁,共享锁
排他锁:只有一个线程能访问代码。
共享锁:可以允许多个线程访问代码。
读写锁:
- 读锁:读的时候,不允许写,但是允许读。
- 写锁:写的时候,不允许读,也不允许写。
统一锁,分段锁
统一锁:大粒度的锁。
-锁定A等待B,锁定B,等待A。
-A+B统一成为大锁。
分段锁:分成一段一段的小粒度的锁。
ConcurrentHashMap
线程池
线程池就是事先创建若干个线程,当有程序需要的时候从池中获取线程,使用完毕不需要销毁线程,而是放回线程池中,从而减少创建和销毁线程池的操作,提高了系统的性能。
线程池的七个参数
- 核心线程数
- 最大线程数
- 生存时间
- 时间单位
- 任务队列
- 线程工厂
- 拒绝策略