乐趣区

关于java:多线程

线程状态


线程总共有 5 大状态:
新建状态 -> 就绪状态 -> 运行状态 -> 阻塞状态 -> 死亡状态
新建状态 :新建线程对象,并没有调用 start() 办法之间
就绪状态 :调用了 start() 办法之后线程进入就绪状态,然而不是立马执行。
运行状态 :线程被设置为以后线程,开始执行 run() 办法。就是线程进入运行状态
阻塞状态 :线程被暂停,比方调用 sleep() 办法后线程就进入阻塞状态。
死亡状态:线程执行完结。

阻塞的状况分三种:

(一)、期待阻塞:运行的线程执行 wait()办法,JVM 会把该线程放入期待池中。(wait 会开释持有的锁)

(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则 JVM 会把该线程放入锁池中。

(三)、其余阻塞:运行的线程执行 sleep()或 join()办法,或者收回了 I / O 申请时,JVM 会把该线程置为阻塞状态。当 sleep()状态超时、join()期待线程终止或者超时、或者 I / O 处理完毕时,线程从新转入就绪状态。(留神,sleep 是不会开释持有的锁)

线程相干的办法
wait():使一个线程处于期待(阻塞)状态,并且开释所持有的对象的锁。
sleep():使一个正在运行的线程处于睡眠状态。
notify():唤醒一个处于期待状态的线程。
notifyAll():唤醒所有处于期待状态的线程。

synchronized 与 Lock 的区别

synchronized 是 java 内置关键字,在 jvm 层面,Lock 是个 java 类


synchronized 是一种乐观锁
Lock 是一种乐观锁

乐观锁: 数据被拜访,认为用户不会去批改数据,都不去上锁。
乐观锁: 数据被拜访,认为用户会去批改数据,都上锁。

退出移动版