Thread类
线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期是一样的,就是线程安全的
多线程访问了共享的数据,就会产生线程安全问题
线程同步:
-
同步代码块
synchronized
关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问
synchronized(同步锁) { 代码块 }
同步锁可以使用任意类型,多个线程要使用同一把锁
-
同步方法
使用synchronized
修饰的方法就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等待
对于非静态方法,同步锁是this
对于静态方法,使用当前方法所在类的字节码对象作为同步锁 -
锁机制
java.util.concurrent.locks.Lock
lock()
加同步锁
unlock()
释放同步锁
java.util.concurrent.locks.ReentraitLock implements Lock
线程状态:
-
NEW 新建态
线程刚刚被创建,但是并未启动,还没调用 start() 方法 -
Runnable 可运行态
线程可以在jvm中运行的状态,可能正在执行代码,也可能没有,这取决于cpu调度 -
Blocked 锁阻塞态
当一个线程试图获取锁对象,而该锁对象被其他线程所持有的,则该线程进入Blocked状态;当该线程持有锁对象时,该线程将变成Runnable状态 -
Waiting 无限等待态
一个线程在等待另一个线程执行一个(唤醒)动作时,该线程进行Waiting状态。进入这个状态后是不能自动唤醒的,必须等待另一个线程调用notify或者notifyAll方法才能够唤醒 -
Timed Waiting 计时等待态
同Waiting状态,有几个方法有超时参数,调用它们将进入Timed Waiting状态。这一状态将一直保持到超时期满或者接收到唤醒通知。带有超时参数的常用方法有Thread.sleep, Object.wait -
Terminated 死亡态
run方法执行完成或者调用stop方法后,线程进入Terminated状态