4. Java并发编程基础

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,任意对象为值得存储结构,是线程的属性;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.线程简介 ①什么是线程 现代操作系统调度的最小单元是线程,也叫轻量级进程,在一个进程里可以创建多个线程,这些线...
    加夕阅读 436评论 0 0
  •   Java从诞生开始就明智地选择了内置对多线程的支持,这使得Java语言相比同一时期的其他语言具有显示的优势。线...
    ShayHe阅读 268评论 0 0
  • 1. cpu通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一任务。但是,再切换之前会保存上一...
    冰与河豚鱼阅读 679评论 0 0
  • 特别说明:文章内容是《Java并发编程的艺术》读书笔记 Java是一种多线程语言,从诞生开始就内置了对多线程的支持...
    codersm阅读 178评论 0 0
  • 1 战友老钱的女儿和男友又吹了。说起分手的原因,是因为老钱女儿对男友要求太多,希望他有房有车;希望他能赚大钱;希望...
    朱敏_5fb2阅读 791评论 0 0