- 博客(23)
- 收藏
- 关注
原创 【尚硅谷周阳--JUC并发编程】【第十四章--ReentrantLock、ReentrantReadWriteLock、StampedLock讲解】
ReentrantReadWriteLock实现了读写分离,但是一旦读操作比较多的时候,想要获取写锁就变得比较困难了,假如当前1000个线程,999个读,1个写,有可能999个读取线程长时间抢到了锁,那1个写线程就悲剧了,因为当前有可能会一直存在读锁,而无法获得写锁,根本没有机会。
2024-03-30 17:58:21 654
原创 【尚硅谷周阳--JUC并发编程】【第十三章--AbstractQueuedSynchronizer之AQS】
Semaphore以上四个他们底层都是继承自AbstractQueuedSynchronizerAQS同步队列的基本结构有阻塞就需要排队,实现排队必然需要队列state变量+CLH双端队列。
2024-03-28 20:50:40 763
原创 【尚硅谷周阳--JUC并发编程】【第十二章--Synchronized与锁升级】
偏向锁:适用于单线程使用的情况,在不存在竞争的时候进入同步方法/代码块则使用偏向锁。轻量级锁:适用于竞争较不激烈的情况(这和乐观锁的使用范围类似),存在竞争时升级为轻量级锁,轻量级锁采用的是自旋锁,如果同步方法/代码块执行时间很短的话,采用轻量级锁虽然会占用CPU资源但是相对比使用重量级锁还是更高效。重量级锁:适用于竞争激烈的情况,如果同步方法/代码块执行时间很长,那么使用轻量级锁自旋带来的性能消耗就比使用重量级锁更严重,这时候就需要升级为重量级锁。
2024-03-28 10:45:06 990
原创 【尚硅谷周阳--JUC并发编程】【第十一章--Java对象内存布局和对象头】
在HotSpot虚拟机里,对象在堆内存中的存储布局可以分为三个部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。
2024-03-25 16:38:25 940 1
原创 【尚硅谷周阳--JUC并发编程】【第十章--ThreadLocal】
1. ThreadLocal并不解决线程间共享数据的问题2. ThreadLocal适用于变量在线程间隔离且在方法间共享的场景3. ThreadLocal通过隐式的在不同线程内创建独立实例副本避免了实例线程安全的问题4. 每个线程持有一个只属于自己的专属Map并维护了ThreadLocal对象与具体实例的映射,该Map由于只被持有它的线程访问,故不存在线程安全以及锁的问题5. ThreadLocalMap的Entry对ThreadLocal的引用为弱引用,避免了ThreadLocal对象无法被回收的
2024-03-24 14:17:03 902 1
原创 【尚硅谷周阳--JUC并发编程】【第九章--原子操作类之18罗汉增强】
AtomicLong的自旋会称为瓶颈 N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停的自旋知道成功,这样大量失败自旋的情况,一下子CPU就打高了;LongAdder当需要在高并发下有较好的性能表现,且对值得精度要求并不高时,可以使用。保证性能,精度代价, LongAdder是每个线程拥有自己的槽,各个线程一般只对自己槽中的那个值进行CAS操作
2024-03-21 21:58:13 433 1
原创 【尚硅谷周阳--JUC并发编程】【第八章--CAS】
CAS会导致“ABA问题”;CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差内会导致数据的变化。比如说一个线程1从内存位置V中取出A,这时候另一个线程2也从内存中取出A,并且线程2进行了一些操作将值编程了B,然后线程2又将V位置的数据编程A,这时候线程1进行CAS操作发现内存中任然是A,预期没有问题,然后线程1操作成功。尽管线程1的CAS操作成功,但是不代表这个过程就是没有问题的。
2024-03-19 19:46:29 576 1
原创 【尚硅谷周阳--JUC并发编程】【第七章--volatile与JMM】
通过内存屏障禁重排重排有可能影响程序的执行和实现,因此,我们有时候希望告诉JVM你别“自作聪明”给我重排序,我这里不需要重排序对于编译器的重排序,JMM会根据重排序的规则,禁止特定类型的编译器重排序对于处理器的重排序,Java编译器在生成指令序列的适当位置,插入内存屏障指令,来禁止特定类型的处理器排序。写指令。
2024-03-18 17:39:44 1025
原创 【尚硅谷周阳--JUC并发编程】【第六章--Java内存模型之JMM】
我们定义的所有共享变量都存储在屋里主内存中每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝)线程对共享变量所有的操作都必须先在线程自己的工作内存中进行后回写主内存,不能直接从主内存中读写(不能越级)不同线程之间也无法直接访问其他线程的工作内存中的变量,线程间变量值的传递需要通过主内存来进行(同级不能互相访问)Java语言里面,Happens-before的语义本质是一种可见性A Happens-Before B意味着A发生过的事情对B来说是可见的。
2024-03-13 21:05:47 808
原创 【尚硅谷周阳--JUC并发编程】【第五章--LockSupport与线程中断】
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语;LockSupport是一个线程阻塞工具,所有的方法都是静态方法,可以让线程在任意位置阻塞,阻塞之后也有对应的唤醒方法。归根结底,LockSupport调用的unsafe中的native代码;LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞的过程,LockSupport和每个使用它的线程都有一个许可(permit)关联。每个线程都有一个相关的permit,permit最多只有一个
2024-03-13 12:08:14 867
原创 【尚硅谷周阳--JUC并发编程】【第四章--锁】
认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。synchronized关键字和Lock的实现都是悲观锁认为自己在使用数据时不会有别的线程修改数据表资源,所以不会添加锁在Java中是通过使用无锁编程来实现,只是在更新数据的时候取判断,之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入如果这个数据已经被其他线程更新,则根据不同的实现方式执行不同的操作,比如放弃修改、重试抢锁等等。
2024-03-07 21:11:16 903
原创 【尚硅谷周阳--JUC并发编程】【第二章--线程基础知识】【第三章--CompletableFuture】
Java线程基础知识及CompletableFuture介绍
2024-03-05 22:27:23 922
原创 【Centos7安装redis6.2.6】
注意,本文基于Centos7安装redis 6.2.6进行介绍,由于Centos7自带的gcc版本为4.8.5,不满足安装redis 6.2.6的最低版本要求,故需要对gcc版本进行升级(若不升级可能会在安装过程中出错)。redis是由C语言开发,因此安装之前必须要确保服务器已经安装了gcc,可以通过如下命令查看机器是否安装。redis.service文件内容配置如下。如果没有安装则通过以下命令安装。
2024-03-01 14:07:29 485
原创 使用io流将insert语句修改为delete语句
使用io流将insert语句修改为delete语句,delete语句使用主键作为删除条件,并将结果输出到文件中import java.io.*;public class MyInsertToDelete { public static void main(String[] args) { // 文件路径 String filePath = "D:/b.sql"; File file = new File(filePath); //
2021-11-30 11:51:06 332
原创 Redis简单介绍
Redis数据库1、简单介绍Redis1.1、概念 redis是c语言开发的,是基于内存(数据存储到内存中)的以键值对存储的非关系型数据库。1.2、redis的特点redis将数据存储到内存当中, redis的读写效率非常高: 读 11万/s 写 8万/sredis中提供了丰富的数据类型: 五种 String hash list set sortedSet注意: redis中数据类型指的是value的数据类型,而key只有Stringredis支持快捷移植数据,re
2020-08-06 14:59:03 117
原创 网络爬虫简单概述
网络爬虫1、概念 网络爬虫本质上就是一个程序 或者 脚本, 网络爬虫按照一定规则获取互联网中信息(数据), 一般来说爬虫被分为三大模块: 获取数据 解析数据 保存数据。 网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。2、爬虫价值爬虫的价值本质就是获取数据的价值. 数据的价值越高, 爬虫的价值越高数据的价值: 一切皆为数据
2020-08-06 11:29:31 2581
原创 SpringMVC简单总结
SpringMVC文章目录SpringMVC1、简介1.1、什么是SpringMVC2、前端控制器介绍3、入门程序HelloWord3.1、所需依赖3.2、配置前段控制器3.3、开发配置控制器3.4、前端控制器关联SpringMVC4、SpringMVC执行流程4.1、流程图4.2、流程介绍4.3、涉及组件分析5、静态资源的访问5.1、引入原因5.2、具体说明5.2.1、我们这样的配置有这样一个问题5.2.2、原因5.3.3、解决方案5.3.4、“/”和“/\*”的区别:6、注解方式开发6.1、注意事项6
2020-08-03 11:48:21 338
原创 IDEA中WEB项目浏览器乱码问题
一、发现乱码今天在敲代码过程中突然发现idea控制台输出的无乱码,但是浏览器中显示的HTML却出现乱码,如下图所示二、可能乱码原因在web项目中,主要编码格式改变的地方有:虚拟机加载文件编码IDE的保存文件编码html文件,xml文件等外部保存的编码web服务器入tomcat的编码三、针对我这个问题我的解决方案第一步首先查看idea的编码是否设置成了UTF-8“settings->File Encodings”,将编码方式修改为"UTF-8"第二步配置关联的Tomca
2020-07-31 20:28:12 3889 3
原创 Spring知识大总结
Spring文章目录Spring一、Spring简介二、SpringIOC1、导入依赖2、编写配置文件2.1、构造器注入以及Setter注入3、测试类4、关于CGLIB5、bean的生命周期6、※spring的作用域7、可重复使用的注入8、级联属性赋值9、继承Bean配置10、SpEL(Spring 表达式语言)11、Spring整合Junit12、依赖注入(DI思想)13、Spring测试14、Spring创建对象的方式15、关于自动方式注入注解16、IoC的半注解方式三、代理模式1、概念2、JDK动态
2020-07-30 11:48:26 586
原创 Mybatis中的动态SQL,对象之间关系以及,mybatis中的缓存
Mybatis中的动态SQL,对象之间关系以及,mybatis中的缓存文章目录Mybatis中的动态SQL,对象之间关系以及,mybatis中的缓存一、动态SQL1、if语句2、choose、when、otherwise语句3、trim、where、set语句4、foreach语句5、where标签6、set标签二、对象之间的关系1、一对一关系2、一对多以及多对一关系2.1、一对多保存2.2、一对多查询2.3、多对一保存2.4、多对一查询3、多对多关系4、关于查询注意事项(额外SQL查询和关联查询)三、M
2020-07-23 17:30:35 790
原创 Java中的Lambda表达式
Java中的Lambda表达式Lambda表达式匿名内部类的简化使用场景:关于函数式接口的相关介绍Lambda表达式的简单介绍格式一:无参,无返回值格式二:有参数,无返回值格式三:有多个参数,无返回值格式四:有参数,有返回值Lambda表达式匿名内部类的简化使用场景:1、注意:这是JDK1.8之后新特性2、Lambda表达式使用的前提,就是接口必须是一个函数式接口关于函数式接口的相关介绍1、在接口中,只有一个抽象方法,那么这个接口就是函数式接口2、java8种提供了一些常用的函数式接口(消费
2020-07-13 16:40:18 104
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人