- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
07-03-01线程_IO串讲
进程是一套顺序执行的指令。
同时开辟并行执行序列即多线程 run() 结束,线程就结束
JVM就是一个进程,在JVM中分出线程
进程数据空间独立;线程数据空间共享, 线程间通信更容易
分配的方式不如线程好,能充分使用CPU的资源。 共享数据就要加锁、解锁,会降低效率。
OS有 时分共享操作系统 和 实时操作系统
时分共享操作系统 时间片 调度系统把每个时间片分给多个进程 性能调优是根据时间片划分, 时间片会影响整个操作系统。
为了让某些工作并行,在进程主线程中开辟多个线程,这就是线程的机制。
我们关心的是被线程共享的数据,主要看synchronized加在何处。往往不加在线程里面,而是在共享的对象上。
只有运行状态的线程才有机会执行代码!
只有等到所有线程终止,进程才结束!
当一个对象分配给某线程锁标记时,其它线程不能访问同步方法,但能访问非同步方法!
起线程的两种方式:1、继承Thread,覆盖run()方法,用start()启动
2、实现Runnable接口,用来构造线程对象。(线程对象不是线程,但代表一个线程)
例子 ProducerConsumer.java
每一个对象都有一个互斥锁标记(monitor),这个锁标记是准备分配给线程的,且只能分配给一个线程
用法一:
synchronized(o){
原子操作代码块
}
哪个线程能拿到o的锁标记,哪个线程才能进入这个同步代码块,用完后释放锁标记
未加同步可能造成数据不一致和数据不完整的缺陷。
用法二:
public synchronized void method(){ …}
等价于:
Public void method(){
Synchronized(this){...}
}
在整个方法中,对this加锁。
构造方法 不能同步,因为还没有当前对象
抽象方法 也不能同步,因为子类覆盖方法后可以是非同步方法,父类就有多余的话。
每一个对象都有一个锁池,装的是等待该对象锁标记的线程。
一个线程可以同时拥有多个对象的锁标记
synchronized(o1){ //同步代码块是可以嵌套的
synchronized(o2){
}
}
当一个线程阻塞在A对象的锁池里的时候,不会释放其所拥有的其他对象的锁标记
每个线程不释放自己拥有的资源,却申请别的线程的资源,就可能造成死锁问题
线程t1: o.wait()
前提: 必须在对o加锁的同步代码块里
1. t1会释放其所拥有的所有锁标记
2. t1会进入o的等待队列
线程t2: o.notify() / o.notifyAll()
前提:必须在对o加锁的同步代码块里
t2会从o的等待队列中释放一个线程/所有线程
推荐:尽量用notifyAll取代notify, 因为由OS决定只释放哪个线程
wait() 和 sleep()的联系和区别:
1. wait()是从Object继承下来的方法,而sleep()是Thread中的静态方法
2. wait() 和 sleep()都要阻塞运行,释放CPU资源
3. wait()要释放锁; 而sleep()不释放锁
wait()方法被调用时会解除锁定,但是我们能使用它的地方只是在一个同步方法或代码块内。
新思路:必要时可利用Object中的 锁标记、锁池、等待队列。 用其wait() / notify() 方法,
自己制造临界资源来进行线程间通讯。
(参考字母数字交叉打印的例子TestNumberCharPrint.java)
其中注意o.notifyAll() 和 o.wait() 的调用顺序,还要注意边界问题,体现在最后要来一个判断if(c!=’Z’) o.wait(); 进而让程序正常结束。
I/O流
一、流的分类
(1) 按数据传输方向划分:输入流和输出流
I 输入流 JVM ——数据源 InputXXX
O 输出流 JVM —— 数据源 OutputXXX
(2) 按数据单位划分:字节流和字符流
字节流 一次传输一个字节
字符流 一次传输一个字符
字节流类:
抽象父类: InputStream 字节输入流 xxxInputStream
实现类:
BufferedInputStream 缓冲流——过滤流
ByteArrayInputStream 字节数组流——节点流
文档评论(0)