线程停止
判断线程是否停止
Thread.interrupt();
测试当前线程是否停止,是指调用该方法的线程是否停止。如果当前状态为已停止,调用该方法返回true,并且清楚线程停止状态
this.isInterrupted();
测试this线程是否停止,不会清除该线程的中断状态
暂停线程
使用suspend暂停线程的弊端
1.独占:如果在运行到临界区时调用了suspend,将会导致独占锁,从而导致其他线程无法进入临界区。
2.不同步:原本的原子操作,如果中途暂停,将会导致数据不一致。如先设置a变量后暂停,导致b变量没有设置,在读取数据时只能获取到更新后的a变量数据。
volatile
两个线程访问同一个变量时,由于编译器的优化,会导致一个线程修改了这个变量,另一个线程不能及时获取最新的值。加入volatile修饰的变量将会关闭这种优化。
synchronize方法
- 在方法声明中加入的synchronize关键字相当于synchronized(this),如:
public synchronized void fun(){
//TODO method body
}
public void fun() {
synchronized (this) {
//TODO method body
}
}
- synchronize锁可重入:当一个线程得到一个对象锁后,再次请求对象锁是可以得到锁的。如果方法A、B都上了锁,线程在执行A方法时得到了对象锁,并且在A方法中调用了B方法,此时请求进入B的对象锁是可以成功的。
- synchronize不继承,如子类重写父类方法签名为
public synchronized void fun(){
//TODO method body
}
的方法时,不加synchronize关键字,则不具备同步特性。