The Java Programming Language4th读书笔记-第十四章 线程

  1. main方法本身就是通过运行时系统创建的线程而执行的;
  2. public Thread(ThreadGroup group, Runnable target, String name, long stacksize)构造方法中的stacksize参数是对该线程的栈大小所提出的建议值。
  3. 线程自身被创建时,它将一个对其自身的引用保存到了它所处的ThreadGroup中,所以是不会被GC回收的;
  4. Java中锁是归线程所有的,所以在一个同步方法中调用同一个对象上的另一个同步方法时,被调用的方法将会直接执行而不会阻塞;只有当最外层的同步方法返回时才会释放所持有的锁;
  5. 如果扩展类覆盖了synchronize的方法,那么新的方法可以是synchronized的,也可以不是,而当超类的方法被调用时仍然是synchronized的;
  6. 在静态同步方法中获取class对象上的锁并不会对这个类的任何对象产生影响,所以当另一个线程在静态同步方法中持有class对象上的锁时,我们仍然可以在这个类的对象上调用同步方法,而只有其他的静态同步方法才会被阻塞;
  7. 和其他所有对象一样,内部类对象也是单独同步的,即获取内部类对象上的锁对于其包围对象上的锁并不会有任何影响,而获取包围对象上的锁对于它所包围的所有内部类对象也不会有任何影响;
  8. 对wait和通知方法的使用有一种非常重要的标准模式,在这种模式中,等待某条件出现的线程应该总是执行某种条件的循环,并且在循环中wait;
  9. wait定义有一个重要的方面,就是当它暂停线程时,它会院子性地释放掉对象上的锁,“线程挂起和锁的释放是原子性的”这一说法是指它们是以不可分割的方式一起发生的,否则,就会产生竞争危机:通知可能会在锁释放之后线程挂起之前发生,也就是说,这个通知实际上可能会丢失而不会对线程产生任何影响。当线程在被通知后又重新启动时,将原子性地再次获取锁;
  10. notifyAll方法会唤醒所有等待的线程,而notify方法只会唤醒一个线程;多个线程可能会等待同一个对象,但是等待的条件可能会不同。如果它们等待的条件不同,那么我们就应该始终使用notifyAll而不是notify来唤醒所有的等待线程。否则,我们可能会唤醒等待条件不同于当前已满足条件的线程,这个线程将会因为发现它的条件并未被满足而继续等待,而等待当前已满足条件的线程将永远不会被唤醒。使用notify是一种优化,但只能应用于下列情况:
    • 所有线程等待的是同一个条件;
    • 至少有一个线程可以从被满足的条件中获益;
    • 使用notify对于所有可能的子类来说都确实是一种优化;
  11. wait操作超时后,由于必须重新获取对象锁,因此使用超时并不能保证wait会在有限的时间内返回;
  12. 避免死锁最常见的方法是使用资源排序,利用资源排序,我们可以对所有必须获取其锁的对象指定顺序,这样就可以保证我们总是以这个顺序来获取锁。
  13. 中断机制是协作代码可以加以利用以使得多线程更加有效的工具。但是,它和其他任何机制都不能处理含有敌意或恶意的代码;
  14. 当线程实际终止时,运行时系统将调用notifyAll;
  15. 线程分两种:用户线程和守护线程,用户线程的存在可以使应用程序保持运行状态,而守护线程则不会。当最后一个用户线程结束时,所有守护线程都会被终止,应用程序也随之结束;
  16. 如果我们希望应用程序在初始线程消亡后就退出,那么可以把所有创建出来的线程都标记为守护线程;
  17. 在确定内存访问如何排序以及何时可以确保它们可见时所使用的规则被称为Java编程语言的内存模型;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值