Java多线程核心技术笔记1

线程停止

判断线程是否停止

  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关键字,则不具备同步特性。

你可能感兴趣的:(Java多线程核心技术笔记1)