搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > Java技术人 > 图解 Java 多线程

图解 Java 多线程

Java技术人 2018-06-29


http://zqhxuyuan.github.io/2017/10/25/Java-Threads/


图解Java多线程笔记:http://tutorials.jenkov.com/java-concurrency/java-memory-model.html

Java内存模型(JMM)定义了:how and when different threads can see
values written to shared variables by other threads,
and how to synchronize access to shared variables when necessary.

Java堆和栈中的对象存储位置:

图解 Java 多线程

Java内存模型与硬件模型:

图解 Java 多线程

线程读取主内存的数据到CPU缓冲中,当数据放在不同位置时,会有两个问题:可见性与静态条件

图解 Java 多线程

A synchronized block in Java is synchronized on some object.
All synchronized blocks synchronized on the same object can only
have one thread executing inside them at the same time.
All other threads attempting to enter the synchronized block are blocked
until the thread inside the synchronized block exits the block.
The synchronized keyword can be used to mark four different types of blocks:

  1. Instance methods -> on the instance (object) owning the method

  2. Static methods -> on the class object of the class belongs to …

  3. Code blocks inside instance methods

  4. Code blocks inside static methods

Synchronized Instance methods(实例方法的同步):

图解 Java 多线程

静态方法的同步:

图解 Java 多线程

代码块的同步:

图解 Java 多线程

用jstack查看,同一个监视器对象只允许有一个线程访问:

图解 Java 多线程

实例方法的同步加上代码块this的同步,仍然针对同一个实例对象:

图解 Java 多线程

自定义监视器对象:

图解 Java 多线程

同一个实例对象的加锁:

图解 Java 多线程

不同实例对象的加锁:

图解 Java 多线程

Volatile keyword guarantees visibility of changes to variables across threads.

every read of a volatile variable will be
read from the computer’s main memory,
and not from the CPU cache.
every write to a volatile variable will be
written to main memory,
and not just to the CPU cache.

If Thread A writes to a volatile variable and Thread B subsequently reads the same volatile variable, then all variables visible to Thread A before writing the volatile variable, will also be visible to Thread B after it has read the volatile variable.
The reading and writing instructions of volatile variables cannot be reordered by the JVM. Instructions before and after can be reordered, but the volatile read or write cannot be mixed with these instructions. Whatever instructions follow a read or write of a volatile variable are guaranteed to happen after the read or write.
volatile变量不保证事务:

图解 Java 多线程

volatile变量仍然会存在竞态条件:

图解 Java 多线程

volatile变量会禁止重排序:

图解 Java 多线程

如果变量在volatile变量更新之后,不保证写到主存:

图解 Java 多线程

为了保证可见性,不需要为每个变量都定义为volatile类型:

图解 Java 多线程

volatile变量是个内存屏障,在这之前和之后的指令可以重排序:

图解 Java 多线程

本地线程的示例:

图解 Java 多线程

下面的上图没有使用本地线程,下图使用了本地线程:

图解 Java 多线程

线程的信号量实现方式–busy waiting:

图解 Java 多线程

或者可以用volatile变量:

图解 Java 多线程

wait和notify的示例:

图解 Java 多线程

notify与notifyAll的示例:

图解 Java 多线程

等待线程有可能意外被唤醒,需要用while循环继续判断是否被唤醒线程notify:

图解 Java 多线程

一次唤醒所有线程,或者每次一个个地唤醒:

图解 Java 多线程

不同线程之间采用字符串作为监视器锁,会唤醒别的线程:

图解 Java 多线程

不同线程之间的信号没有共享,等待线程被唤醒后继续进入wait状态:

图解 Java 多线程

不同线程的等待与唤醒示例:

(完)

看完本文有收获?请转发分享给更多人

关注「Java技术人」,做全栈开发工程师

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《图解 Java 多线程》的版权归原作者「Java技术人」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Java技术人微信公众号

Java技术人微信公众号:JavaTechnician

Java技术人

手机扫描上方二维码即可关注Java技术人微信公众号

Java技术人最新文章

精品公众号随机推荐

下一篇 >>

zabbix微信报警