![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java多线程
文章平均质量分 52
小小羊肉串。
余生没那么长,请你忠于自己,活的像自己。
展开
-
AQS
文章目录1.AQS简介2.AQS的数据结构 1.AQS简介 AQS全称Abstract Queued Synchronizer ,即抽象队列同步器。 分步理解: 抽象:抽象类,值实现一些主要逻辑,有些方法由子类实现; 队列:使用先进先出(FIFO)队列存储数据; 同步:实现了同步的功能。 AQSD的作用:是用来构建锁和同步器的框架,使用AQS能够简单高效构造出应用广泛的构造器。比如ReentrantLock、Semaphore、ReentrantReadWriteLock、SynchronousQueue、原创 2021-02-26 00:18:51 · 126 阅读 · 0 评论 -
乐观锁和悲观锁
1.悲观锁 线程每次访问能同步资源时,会给操作数据加锁,保证临界区的程序同一时间只能有一个线程执行。没获得锁线程会进入阻塞队列。等待再次获取锁。 2.乐观锁 又称为“无锁”。通过CAS技术保证线程执行的安全性。 乐观锁适用于读多写少的场景,避免频繁加锁影响性能; 悲观锁适用于写多读少的场景,避免频频繁失败和重试影响性能。 3.CAS CAS全称(Compare And Swap)比较并替换,是一种无锁算法。在CAS中,有3个值: V:要更新的内存地址; E: 旧值 N:新值 当且仅当V的值等于E时,将V的值原创 2021-02-25 23:47:31 · 316 阅读 · 0 评论 -
synchronized与锁
java多线程的锁都是基于对象的,java中的每一个对象都可以作为一个锁。 类锁其实也是对象锁。 1.synchronized关键字 (1)synchronized在实例方法上,锁为当前实例 private synchronized void testMethod(String flag) throws InterruptedException { synchronized (lock) { for (int i = 0; i < 10; i++) {原创 2021-02-25 16:47:31 · 124 阅读 · 1 评论 -
volatile
1.基本概念 内存可见性:指线程之间的可见性,当一个线程修改了共享变量时,另一个行程可以读取到修改后的值。 重排序:为了优化性能,对原有的指令执行顺序重新排序,重排序可能发生在多个阶段,比如编译重排序、CPU重排序等。 happens-before规则:是一个给程序员的使用规则,只要程序员遵循hanppens-before编码,JVM就能保证指令在多线程的执行顺序符合程序员的预期。 2.volatile的功能 保证变量的内存可见性; 禁止volatile变量和普通变量重排序。 2.1 volatil原创 2021-02-24 15:27:22 · 57 阅读 · 0 评论 -
JMM的happens-before规则
1.happens-before JMM使用happens-before概念来定制两个操作之间的顺序,这两个操作可以使同一个线程以内,也可以是不同线程之间。JMM通过happens-before关系向程序员提供跨线程的内存可见性保证。 (1)如果一个操作happens-before另一个操作,那么第一个操作的结果将对第二个操作可见。 (2)如果两个操作存在happens-before关系,并不意味着java平台的具体实现一定要按照happens-before指定顺序执行,如果重排序之后的执行结果,与按hap原创 2021-02-23 15:49:18 · 162 阅读 · 1 评论 -
java内存模型的基础知识
1.java运行时内存的划分 栈与堆的区别: 栈内存存储的是局部变量,而对内存存储的是实体; 栈内存的更新速度快于堆内存,因为局部比纳凉的生命周期很短。 栈内存存储的变量生命周期一旦结束就会被释放,而堆内存存储的实体被垃圾回收机制不定时回收。 对每一个线程来说,栈是私有的,堆是共有的。 2.堆是共享的,关于堆中内存不可见问题 线程的共享变量存储在主内存中,每个线程都有一个私有的本地内存。它存储了该线程以读、写共享变量的副本。 java线程之间的通信由java内存模型控制(j简称JMM)。 JMM定义了线原创 2021-02-20 17:27:44 · 77 阅读 · 0 评论 -
java线程间的通信
1.锁与同步 线程同步:线程之间按照一定的顺序执行。 用所来实现线程同步 @Test public void blockedTest() throws InterruptedException { Thread a = new Thread(new Runnable() { @Override public void run() { testMethod("a");原创 2021-02-20 15:47:57 · 70 阅读 · 0 评论 -
java线程的状态及主要转换方法
1.操作系统中的线程状态转换 操作系统线程的状态和操作系统进程的状态时一致的。 操作系统主要有3个状态: Readying(就绪状态):线程正在等待使用CPU,经调度程序调用后可进入Running状态。 Running(运行状态):线程正在使用CPU。 Waiting(等待状态):线程经过等待状态或者正在等待资源(例如I/O)。 2.Java线程的6个状态 public enum state{ NEW, RUNNABLE, BLOCKED,原创 2021-02-20 11:31:43 · 248 阅读 · 0 评论 -
线程组和线程优先级
1.线程组 每个Thread必然存在于一个ThreadGroup中,Thread不能独立于ThreadGroup独立存在。 执行main方法的线程名字是main,如果在new Thread时没有显式置顶,那么默认将父线程(当前执行new Thread线程)的线程组设置为自己的线程组。 2.线程的优先级 线程的优先级范围为1~10; java默认的线程优先级为5,线程的执行顺序由调度程序来执行,线程的优先级会在线程被调用之前设定。 使用Thread的setPriority()来设置线程的优先级。 线程的调度原创 2021-02-19 19:19:07 · 162 阅读 · 0 评论 -
1.2 java多线程入门类和接口
1.Thread类和Runable接口 JDK提供了Thread和Runanle接让我们实现自己的线程类。 继承Thread类,重写run()方法; 实现Runable接口,实现run()方法 2.Thread常用的几个方法 currentThread():静态方法,返回对当前正在进行线程的引用; start():开始调用线程的方法,java虚拟机会调用run()方法; yield():当前线程愿意让出对当前处理器的占用; sleep();使当前线程睡眠一段时间; join():使当前线程等待另一个线程原创 2021-02-19 17:31:47 · 79 阅读 · 0 评论 -
进程与线程的基本概念
@[TOP] 1.批处理操作系统 将需要操作的一系列指令列成清单,交给计算机。用户将多个需要执行的程序写在磁盘上,将磁盘交由计算机逐次执行这些指令,然后将执行的结果写在另一个磁盘上。 缺点:批处理操作系统的指令运行方式是串行执行的,内存中始终只有一个程序在运行,前面的程序执行完成后面的才能执行。前面的程序回应为I/O操作、网络等原因阻塞,所以效率也不高。 2.进程 进程是应用程序在内存中分配的空间,也就是正在运行着的程序,各个进程之间互不干扰。 进程保存着程序每一个时刻运行的状态。 程序:用一定的语言(ja原创 2021-02-19 11:43:54 · 161 阅读 · 1 评论