三种线程池的特点及范围:
1-继承Thread类,重写父类run()方法。
2-实现runnable接口。
3-使用Executor Service。
多线程同步机制:
1-在需要同步的方法中加入synchronized关键字。
同步方法,synchronized在方法上;同步代码块,synchronized在代码块上。
2-使用lock锁对象。锁是对象的。JDK5,java.util.concurrent.lock包。
监视器和锁在Java虚拟机一块使用。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。
每一个监视器都和一个对象引用相关联,线程获取锁之前不允许执行同步代码块。
3-流程:
拿到lock锁执行权限(一个对象一把锁)
---->无锁---->等待队列(线程阻塞)
---->有锁---->执行同步代码块sychronized---->执行完把锁还给同步对象
4-保证同步代码在同一时刻只有一个线程在执行。
启动线程用start(),可运行状态。
run()方法可以产生必须退出的标识来停止一个线程。
线程的几种可用状态:
Runnable-就绪:线程准备运行,不一定立马开始。
Running-运行中:进程正在执行线程的代码。
Waiting-等待中:线程阻塞。wait():Object类的方法,释放锁对象,notify()线程进入对象锁定池。
Sleeping-睡眠中。sleep():Thread线程类的方法,不释放锁对象,暂停时间到自动恢复。
Blocked on I/O-IO阻塞:等待IO操作完成。
Blocked on Synchronization-同步阻塞:等待获取锁。
Dead-死亡:线程完成执行。
死锁:
1-两个进程都在等待对方执行完毕才能继续往下执行时发生死锁。
2-强制线程按照指定的顺序获取锁,可以确保N个线程可以访问N个资源的同时不发生死锁。