美文网首页
4. Java并发编程基础

4. Java并发编程基础

作者: 星冉子 | 来源:发表于2020-02-13 10:07 被阅读0次

Java多线程

Java程序的运行是main线程和多个其他线程的同时运行,包括JVM内部线程

使用多线程的原因:更多的处理器核心;更快的响应时间;Java提供的更好的编程模型。

线程优先级:决定了分配CPU时间片即CPU资源的多少,不同操作系统可能不会处理该字段;

线程的状态:NEW、RUNNABLE(包括就绪和运行中)、BLOCKED、WAITING、TIME_WAITING、TERMINATED;

Daemon:只能在启动线程前设置;虚拟机退出会立即终止所有Daemon线程;Daemon线程不会执行finally;

创建线程:新线程由父线程分配空间,继承父线程的Daemon、优先级、ClassLoader、ThreadLocal属性;

中断:中断只是线程的一个标记位,好比其他线程对当前线程打了声招呼;

isInterrupted方法:线程处于终止状态则始终返回false;sleep方法在中断异常前会清除中断标识即为false;

suspend、resume、stop:不建议使用,suspend不会释放锁容易造成死锁;stop不保证资源正常释放;

正确终止线程:通过标记位或者isInterrupted方法判断来终止线程;

线程间通信

1. volatile和synchronized:多线程修改共享变量通过volatile修饰;synchronized加锁访问;

2. wait和notify:wait和notify使用都需要对对象加锁;wait会释放锁;wait返回的条件:notify、中断、超时;notify之后等待线程不会立即返回,而是notify的线程释放锁之后等待线程如果获取到锁才会返回;

流程:wait之后线程状态为Waiting,进入对象的等待队列;notify之后线程状态为Blocked,进入对象的同步对象,释放锁并获得锁之后从wait返回执行;

问题:

丢失的信号:notify再wait之前了,解决:notify时通过共享变量保存下来,wait时判断变量;

假唤醒:没有notify而从wait醒了,解决:自旋wait;

3. 管道输入输出流:管道流用于线程间数据传输,传输媒介为内存,PipedInputStream\PipedOutputStream\PipedWriter\PipedReader

使用时需要把输入和输出流connect()绑定才能使用;

4. Thread.join():A线程中执行B.join,B线程执行完之后才返回,内部使用wait实现;

5.ThreadLocal:线程本地变量,是一个以ThreadLocal为Key,任意对象为值得存储结构,是线程的属性;

相关文章

网友评论

      本文标题:4. Java并发编程基础

      本文链接:https://www.haomeiwen.com/subject/tdulnctx.html