点击查看:原文
本文是清华大学许斌老师的公开课:Java语言程序设计进阶 的课堂笔记,快速复习一下,时间有限,因此大量直接截图。许斌老师声明:没有配套讲义,建议参考书籍:周志明《深入理解java虚拟机》。(JUC) java.utile.concurrency 部分参考源码和技术博客。
文章目录
第一章 线程(上)
1.0 导学
1.1 线程的基本概念
1.2 通过Thread类创建线程
1.3 线程的休眠
注:线程休眠的原因就是让其他线程有执行的机会
1.4 Thread类详解
注:线程启动(即调用start方法)并不意味着线程马上运行,线程是否运行取决于线程调度器。
1.5 通过Runnable接口创建线程
注:Runnable接口中我们所实现的run方法就是我们这个线程想要执行的代码
1.6 线程内部的数据共享
同样一个线程类,它可以实例化出很多线程。同样一个线程,它们是可以共享它们的代码和数据,那也就是说当我们实现了Runnable接口的这个类,它所实例出来的对象的话,它去构造出的线程,它们之间是可以共享它们的代码和它们之间的一些数据的。
小结
第二章 线程(中)
2.0 导学
2.1 线程同步的思路
注:那原因就是在于说这两个线程的话,它们是同一优先级,只不过是说这个producer先这个排在前面,所以的话从调度上,往往会调度它这个producer先执行,那它一执行呢就把这个票都生产完了,然后再等待着卖票的程序把它去卖掉,这是一种有意思的这个现象
2.2 线程同步的实现方式—Synchronization
注:把这两行代码变成一个(原子)操作,就是在执行过程中不可能被打散执行
注:用synchronized后面大括号括起来其实是代码,实际上它把它变成一个原子操作,也就是说当我拿到这个对象t的锁的时候,我这里面的这些代码是肯定都会被执行的,不会说我执行某一句以后就被这个打断,然后那个插入别的线程去执行去访问这个对象t,所以这个是synchronized它的很重要的作用。
就像刚才我们那个例子:我们在这个售票线程里面,每售出来票的时候,它就会休眠一毫秒,但休眠一毫秒的时候,它不会释放出它所占有的这个ticket对象的锁的,它一直会持有,所以这是一个独特的一个地方。
2.3 线程的等待与唤醒
注:那现在wait notify notifyAll方法这三个方法都属于object这个类的方法,也就意味着我们java当中所有的类它都有这个三个方法
注:修改之后,相当于票箱大小为1,Tickets.size = 1。Tickets.put() 方法中的 notify() 与 Tickets.sell() 方法中的wait()一一对应,Tickets.put() 方法中的 wait() 与 Tickets.sell() 方法中的notify()一一对应。