书记_《Java多线程编程核心技术》

第一章

  1. Thread类实现了Runnable接口继承或扩展Thread类或者Thread类实例化时传入Runnable的实现或扩展来使用线程。
  2. 一个进程运行时至少有一个线程正在运行。public static void main(String[] args)由main线程执行。
  3. 一个线程执行start()多于一次,会报IllegalThreadStateException。start()通知线程规划器此线程就绪,系统在一个时间调用Thread中的run()Thread.currentThread()可获取当前线程。start()和run()由Thread.currentThread()执行。
  4. synchronized可对静态方法和Class型同步代码块(类锁),及实例方法和this和其他变量型同步代码块(实例锁)(对象锁)加重量级锁(线程争抢不到资源则阻塞),可避免非线程安全(多个线程更改同一个实例的同一个变量会产生值不同步)。参考:https://www.jianshu.com/p/d53bf830fa09
  5. isAlive()判断当前线程是否处于活动状态(启动尚未终止,即正在运行)。存活是指线程准备运行或正在运行。
  6. sleep()让当前线程休眠指定毫秒数。
  7. getName()可以得到线程的名称。
  8. getId()可以得到线程的唯一标识。
  9. interrupt()可以将线程标记为中断(停止),并不会中断线程。
  10. interrupted()可以判断线程是否被标记为中断,如果是中断,标识为非中断。
  11. isInterrupted()同样可以判断线程是否被标记为中断,如果是中断,不标识为非中断。
  12. try{}中throw InterruptedException(),然后catch(InterruptedException e){}来中断线程运行。也可以用return来中断线程。
  13. 线程interrupt()后sleep(),或者sleep()后interrupt(),会报InterruptedException。
  14. stop()可以暴力停止线程,被作废,不推荐,会使清理工作得不到完成;数据不不到同步。
  15. suspend()可以暂停线程,resume可以恢复线程运行,不推荐,会导致此线程加锁的资源无法被释放;数据不同步。
  16. yield()可以使线程放弃占用CPU时间片,让给其他任务,放弃时间不确定,放弃后可能立刻重新获得CPU时间片。
  17. setPriority(int newPriority)可以设置线程优先级。线程优先级有规则性,最小为1,最大为10,默认为5。优先级越大,运行得越快,越有可能早被执行完。之所以说有可能,是因为线程优先级有随机性。线程优先级有继承性,A线程启动B线程,B线程优先级和A相同。
  18. setDaemon(boolean on)可以设置线程是否为守护线程。守护线程,也称服务线程,另一种线程为用户线程。守护线程为用户线程服务,优先级低于用户线程。垃圾回收线程即守护线程。如果JVM中没有用户线程在运行,JVM就会退出。

第二章

  1. 非线程安全发生在多个线程并发访问同一个实例的同一个变量时,后果就是脏读,即取到的数据被非法修改(数据交叉感染,数据不同步)。线程安全就是获得的实例变量经过同步处理,不会出现脏读。方法内部私有变量不存在非线程安全。
  2. synchronized拥有锁重入功能,即synchronized锁(同步锁)是可重入锁(线程可以直接得到内层的锁)。比如一个线程得到一个对象锁后,再次请求此对象锁,无需争抢即可得到。一个synchronized方法/块内调用其他synchronized方法/块,永远可以得到锁,如果不可锁重入,会造成死锁。同一个类或实例或者父子类或实例都适用。
  3. 线程执行的代码出现异常,持有的锁会自动释放
  4. synchronized(同步)不可继承
  5. 同步锁锁代码块比锁方法更能节约时间
  6. 线程访问一个对象的一个同步方法或者同步代码块时,其他线程对此对象的所有同步方法或者同步代码块的访问被阻塞,同步方法私有变量代码块除外。所有synchronized方法/块对同一个对象使用的监视器是同一个。
  7. 同步非this变量代码块比同步this代码块快。
  8. 一个线程对同步方法私有变量代码块的执行可以被其他线程暂停,因为对象监视器不同。
  9. 对类加锁相当于对类的所有实例加锁。
  10. 因JVM字符串常量池缓存,”a” == ”a”。同步字符串变量代码块时,如果字符串值相等,则采用相同的对象监视器。
  11. cmd中,jps可查看Java进程,jstack -l Java进程号可查看是否有死锁。

 

 

你可能感兴趣的:(书记,#,线程池)