多线程与高并发
Waiting_Mr_Liu
这个作者很懒,什么都没留下…
展开
-
拾遗增补-InterruptedException 异常
6.5. InterruptedException 异常1)出现场景当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法。抛InterruptedException的代表方法有:a. java.lang.Object 类的 wait 方法。执行wait方法的线程,会进入等待区等待被notify/notify All。在等待期间,线程不会活动。b. java.lang.Thread 类的 sleep 方法。执行sleep方法的原创 2020-09-09 23:37:14 · 198 阅读 · 0 评论 -
拾遗增补-死锁
6.8. 死锁1)死锁定义:多个线程在运行过程中因争夺资源而造成的一种僵局,当线程处于这种僵持状态时,如果没有外力作用,这些线程将无法继续进行。2) 死锁产生原因:a.系统资源的竞争:系统资源竞争会导致系统资源不足以及资源分配不当,导致死锁。b.线程的运行顺序不合适:线程在运行过程中请求和释放资源的顺序不当会导致死锁3) 产生死锁的必要条件a.互斥条件:线程对分配的资源有排他性控制,即在一段时间内某个资源仅为一个线程所占用。b.请求和操持条件:当线程因请求资源而阻塞时,对已经获得的资源保持不原创 2020-09-09 23:36:07 · 75 阅读 · 0 评论 -
拾遗增补-指令重排序
6.7. 指令重排序6.7.1. 指令重排序的介绍1)指令重排序的类型在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序。重排序分三种类型:编译器优化的重排序 编译器在不改变单线程程序语义的前提下(代码中不包含synchronized关键字),可以重新安排语句的执行顺序。指令级并行的重排序 现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。内存系统的原创 2020-09-08 23:21:22 · 169 阅读 · 0 评论 -
线程的状态
6.1. 线程的状态1)线程状态分类2)线程状态间的转换3)样例程序public class ThreadState { public static void main(String[] args) throws InterruptedException { threadStateThread thread = new threadStateThread(); System.out.println("线程新建后的状态为"+thread.getState()原创 2020-09-07 23:09:33 · 448 阅读 · 1 评论 -
AQS详解
4. AQS4.1. AQS的认识1)所属层次2)AQS介绍AQS(AbstractQueuedSynchronizer)就是抽象的队列式的同步器,是一个Java提供的底层同步工具类,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。3)AQS主要作用AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,如常用的ReentrantLock/Semaphore/CountDownL原创 2020-08-25 12:31:21 · 234 阅读 · 0 评论 -
膨胀式的锁分布策略
3. 膨胀式的锁分布策略3.1. Java对象头与Monitorjava对象头是实现synchronized锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的。对象头包含两部分:Mark Word 和 Class Metadata Address,如下图所示其中,Mark Word在默认情况下存储着对象的HashCode、分代年龄、锁标记位等以下是32位JVM的Mark Word默认存储结构,如下图所示:此外,由于对象头的信息是与对象自身定义的数据没有关系的额外存储成本原创 2020-08-21 12:45:05 · 150 阅读 · 0 评论 -
Atomic类
2.8. Atomic类2.8.1. Atomic类综合介绍1)原子操作原子操作意为”不可被中断的一个或一系列操作”。2)处理器实现原子操作a) 处理器会自动保证基本内存操作的原子性:处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取/写入一个字节时,其他处理器不能访问这个字节的内存地址。b) 总线锁保证原子性:所谓总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占使用共享内存。c) 缓存锁原创 2020-08-20 23:48:57 · 744 阅读 · 0 评论 -
volatile关键字
2.7. volatile关键字2.7.1. volatile关键字的基础介绍1)volatile关键字的作用具有可见性,使变量可以在多个线程间可见,即在一个线程中修改一个变量的值,能够在其他线程中读到修改后的值。Volatile关键字本质上是个轻量级锁。2)工作原理在JDK8及以后版本中,JVM都是默认运行在服务器模式,当启动多个线程后,成员变量会存在于公共堆栈和私有堆栈中,当使用服务器模式时为了提高线程运行的效率,线程一直在私有堆栈中取得变量的值,这就导致问题。使用volatile关键字修饰后原创 2020-08-18 12:07:25 · 95 阅读 · 0 评论 -
ReentrantLock和ReentrantReadWriteLock
2.5. ReentrantLock2.5.1. ReentrantLock介绍1)基本介绍在Java多线程中,可以使用synchronized关键字实现线程之间的同步互斥,但是在JDK1.5中增加ReentrantLock类也可以达到同样的效果,并且在扩展功能上更加强大,比如有嗅探锁定、多路分支通知等,而且使用上比synchronized更加灵活。2)样例程序public class ReentrantBaseUsing { public static void main(String[原创 2020-08-18 12:04:05 · 239 阅读 · 0 评论 -
synchronized同步代码块
2.4. synchronized同步代码块2.4.1. 同步代码块的使用方法1)使用方法说明:在多个线程共同访问的代码放在synchronized(){ 代码块 } 中的代码块位置处。2)样例程序:public class UsingMethod { public static void main(String[] args) { Service service = new Service(); UsingMethodThread1 thread1 = n原创 2020-08-17 12:25:40 · 462 阅读 · 0 评论 -
synchronized同步方法
2.3. synchronized同步方法2.3.1. synchronized方法的锁对象1)先持有先运行Synchronized取得的锁都是对象锁,而不是把一段代码/方法作为锁,因此在多线程中,哪个线程先执行带有synchronized关键字修饰的方法,哪个方法就持有该方法所属对象的锁,其他线程只能呈等待状态。但是,前提是:多个线程访问的是同一个对象,如果多个线程访问的不是同一个对象,JVM则会创建出多个对象锁。样例代码:public class MultiObjectLock { p原创 2020-08-17 12:14:58 · 578 阅读 · 0 评论 -
线程的同步机制
2 线程的同步机制2.1. 线程安全与非线程安全1)线程安全与非线程安全非线程安全是当多个线程访问同一个对象汇总的成员变量时产生的,产生的后果就是脏读,就是指读到的数据是被更改过的。而线程安全就是对获取成员变量的值经过同步处理,不会再出现脏读的现象。2)线程不安全的产生条件a.存在多个线程b.多个线程共享同一个资源c.对共享资源进行非原子性操作3)线程安全的特征1.局部变量是线程安全的,不存在线程安全问题,这是由于局部变量时私有的特征决定的。样例程序解释:public class Lo原创 2020-08-16 13:00:08 · 310 阅读 · 0 评论 -
线程池
1)线程池的作用限制在系统中可以运行线程的数量,根据系统环境的情况,自动或手动设置线程数量,已达到最佳运行的效果。2)原理介绍用线程控制线程的数量,规定数量线程外的线程排队等候,一个任务完成以后再从队列中取最前面的任务开始执行,如果队列中没有等待的线程则线程池资源处于等待状态。当一个新任务需要运行时,如果线程池中有等待的工作线程就直接开始执行,否则进入等待队列。3)使用线程池的原因a.减少创建和销毁线程的次数,每个工作线程都可以被重复复用,可执行多个任务。b.可以根据系统能力调整线程池中工作线程原创 2020-08-15 23:26:55 · 527 阅读 · 0 评论 -
线程的方法
1.构造方法public Thread() :分配一个新的线程对象。public Thread(String name) :分配一个指定名字的新的线程对象。public Thread(Runnable target) :分配一个带有指定目标新的线程对象。public Thread(Runnable target,String name) :分配一个带有指定目标新的线程对象并指定名字。2. 常用方法常用方法可总结为:ggricss (getName、getId、run、isAlive、curren原创 2020-08-15 23:19:11 · 89 阅读 · 0 评论 -
多线程的创建方式
多线程的创建方式 创建多线程有八种方式:继承Thread类、实现Runnable接口、实现Callable接口、匿名内部类、线程池、定时器、Lambda表达式、Spring方式方式1: 继承Thread类1)实现步骤: a.创建一个类,这个类需要继承Thread b.重写Thread类的run方法(业务代码) c.实例化创建好的线程类 d.调用实例化对象的start方法启动线程2)内存图解 以一个简单的程序为例,其中Thread类的子类中重写run方法为for循环打印一个数。本原创 2020-08-13 22:56:05 · 198 阅读 · 0 评论 -
线程与进程的关系
线程、进程1.多线程的介绍1)多线程的优点a.可以把占据时间较长的任务放到后台去处理b.程序的运行速度加快2)多线程运行具有以下特点a.随机性。在多线程编程中,代码的执行结果与代码的执行顺序或调用顺序是无关的。线程是一个子任务,CPU以不确定的方式或者是以随机的时间来调用线程中的run方法。如果直接调用线程对象的run方法,不是启动线程,则是由main主线程来调用run方法。b. start的执行顺序与线程的启动顺序不一定是一致的,即创建线程的顺序不一定就是线程执行的顺序。c.在多线程中,m原创 2020-08-13 22:21:05 · 175 阅读 · 0 评论