
第1章线程基础
1.1. 线程(Thread)
线程是程序中的单个顺序控制流. 在单个程序中同时运行多个线程以完成不同的任务称为多线程处理.
例如,用户在电子商务网站中发起请求,从服务器接收到该请求到处理所有业务逻辑并返回结果的过程通常是线程. 当来自客户端N的多个请求同时请求服务器时,这就是多线程并发.
1.2. 共享资源
允许不同线程访问的资源. 共享资源是允许多个线程中的多个线程访问的类变量或实例变量. 共享资源可以是单个类变量或实例变量,也可以是一组类变量或实例. 变量.
1.3. 锁定

当多个线程共享同一共享资源时,将发生冲突(资源竞争). 锁用于解决此类冲突,并确保每个线程有序地使用共享资源.
解决冲突的过程与上厕所相同. 如果来自ABC的三个人上厕所,而厕所中只有一个坑,则一次只能一个人进入. A先到,然后在A出来之前,厕所处于“锁”状态. 一旦B和C死了,他们就必须在外面等. (有很多原因,例如入睡,方便,忘记带厕纸并跑来找人...)“”锁“必须释放B和C才能进入.
1.4. 线程安全
当资源可以被多个线程中的对象调用而没有冲突时,该资源可以是线程安全的.

线程生命周期
第2章使线程不安全的条件

操作共享资源的线程的过程如下:
将共享资源从主存储器复制到工作存储器à修改副本à将副本从工作存储器写回到主存储器多线程技术问题解决,以便两个线程可以同时出现在主存储器的共享资源中时间将副本复制到其工作内存中,但是当两个线程将其修改后的副本放回主内存时将出现问题,放回的内容将在放回后被覆盖,这将导致线程不安全.
导致线程不安全的唯一条件是“有多个线程同时修改共享资源”.
包括以下两个关键点:
(1)有共享资源
(2)不同的线程同时修改共享资源
第3章如何避免线程不安全

3.1. 尝试使用局部变量
这样做是为了不满足线程不安全条件下的“现有共享资源”.
3.2. 尽量不要修改共享资源
这是通过不修改共享资源来实现的,从而达到程不安全的情况下不满足“同时由不同线程修改共享资源”的目的.
3.3. 锁定共享资源
3.3.1如果必须使用共享资源并需要对其进行修改,请锁定共享资源以确保一次只有一个线程在操作它.
最常见的锁定方式是添加同步关键字

3.3.2. jdk多线程并发包
我们使用的HashMap,ArrayList和其他容器收集包通常存程安全问题. 看过JDK源代码的朋友知道这些实现类是低级的. 为了提高性能多线程技术问题解决,这些收集操作方法均未锁定. 只有Vector和Stack是线程安全的. 您可以查看他们的源代码. 基础方法的代价是添加同步到该方法. 换句话说,它占用空间. Sun JDK在多线程并发环境中完成了许多并发解决方案. 它的大多数类都在java.util.concurrent. *下. 该包下的类和java.util. *包下的集合类几乎都在使用. 没什么区别.
以ConcurrentHashMap为例: java.util.concurrent. *包下的ConcurrentHashMap和java.util. *包下的HashMap在功能和使用上没有区别,但是ConcurrentHashMap是线程安全的,并且支持多线程并发. HashMap不是线程安全的.
java.util.concurrent. *包还具有许多实用的线程安全类,在此不再赘述

Java并发编程
第4章ThreadLocal
当涉及多线程并发的线程安全性问题时,我们必须说ThreadLocal. 互联网上的许多帖子都说: “ ThreadLocal解决了多线程的线程安全问题,并为多线程的线程安全提供了新的解决方案. ”我认为此说法不正确.
首先,不使用ThreadLocal解决共享对象的多线程访问问题. 通常,通过ThreadLocal.set()程中的对象是线程本身使用的对象,其他线程则不需要访问. 无法访问. 每个线程访问不同的对象,多线程并发是为了解决使用同一对象(共享资源)的多个线程的冲突问题.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-266377-1.html
╯□╰)o
绝大多数的人都不理解谢教授的真正用意