自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 收藏
  • 关注

原创 Java中的线程池ThreadPoolExecutor

Java中创建线程的方法有四种,分别为继承Thread类,实现Runnable接口,实现Callable接口和通过线程池。在实际开发中,我们最常用的就是线程池的方法,因为利用线程池我们可以重复利用线程,减少每次创建线程所带来的额外开销;同时使用线程池也方便我们维护管理线程信息;此外,线程池的存在也可以帮助我们避免出现因为代码bug导致的无限创建线程导致系统资源耗尽等问题。Java中通过使用ThreadPoolExecutor来创建管理线程池,而Spring框架中使用ThreadPoolTaskExecu

2022-06-26 15:59:26 931 1

原创 Java中的中断机制

Java中对于线程的中断机制是分不同的情况的,如果当前线程处理运行RUNNABLE状态下,那么调用它的interrupt中断方法并不会影响线程的执行,也不会抛出异常,它只会将线程中标志中断状态的Boolean值变更为true;而如果线程因为slee或者wait方法进入阻塞或者等待状态下的话,调用interrupt方法,此时线程会修改中断状态然后抛出中断异常。值得一提,如果线程是因为LockSupport.park方法进入阻塞状态,那此时调用interrupt方法依旧只会改变线程的中断状态为true,而不

2022-03-25 16:27:21 839

原创 Java中ReentrantLock,公平锁,非公平锁与synchronized

本文内容及代码参考视频:https://www.bilibili.com/video/BV1ta4y1H73X/?spm_id_from=333.788.recommend_more_video.-1ReentrantLock是Java开发中最常用到的组件之一,简单来说,可以把ReentrantLock理解为基于AQS所实现的公平锁与非公平锁,用于实现对共享资源对象的同步。它和synchronized关键字一样支持可重入,但在调度上相较于synchronized更加的灵活。接下来我们从其内部继承和功能.

2022-03-25 16:15:53 1159

原创 Java并发编程AQS详解

AQS,全称AbstractQuenedSynchronizer,可以理解为抽象的队列同步器。所谓抽象就代表着这个类要被继承和复用,实际上AQS这个类也确实是Java实现多线程并发编程的中必不可少的一个基础类,JUC中许多工具类的内部都继承了AQS,而AQS的底层则广泛的应用了CAS的实现。下面我们从源码的角度来深入了解一下AQS这个类。1.AQS的内部属性进入AQS类的内部我们先来了解其最重要的三个内部属性: private transient volatile Node head;

2022-03-25 11:37:30 9512

原创 Java乐观锁与CAS

本文内容及部分代码图片参考视频:https://www.bilibili.com/video/BV1ff4y1q7we?spm_id_from=333.999.0.01.乐观锁与悲观锁的区别Java中处理多线程调用同一个资源对象时有两种处理方式,第一种:操作系统悲观的认为接下来的操作者中,如果不能严格的同步线程调用,那么一定会出现数据不一致等异常,因此需要需要在一开始就使用锁将资源对象锁定,一个时刻只供一个线程调用,其它线程将会被阻塞,因此这种同步机制也被称为悲观锁;第二种:系统认为接下来多线程..

2022-03-24 21:03:31 937

原创 Java中的悲观锁,Synchronized关键字及锁升级机制

1.Java中锁的理解在并发状况下,如果存在多个线程对同一个资源进行抢夺的情况,就有可能会导致数据不一致的问题,在Java中就可以具体为多个线程对某个对象的争夺。为了解决这个问题,Java引入了锁机制,通过锁机制对资源的读取进行限制,当某个线程获取到锁时,其它的线程都要进行等待,本质上就是将所有的线程进行了串行化,解决了并发中出现的数据不一致问题。那Java中具体是如何实现锁的呢?在具体介绍Java中的锁之前,我们先来了解一下Java虚拟机的内存模型,具体如下图所示: ...

2022-03-24 17:22:28 756

原创 抽象类与接口的区别

1.相同点①都是用于规定某个方法的定义形式并交由其它类去具体实现;②可以将抽象类和接口用于引用类型;③一个类如果继承了某个抽象类或者实现了某个借口就需要对里面所定义的所有抽象方法进行实现,否则该类任然会定义为抽象类;2.不同点①抽象类可以定义构造器但借口不行;②抽象类里面可以定义抽象方法也可以定义具体方法,但接口里面只能定义抽象方法;③一个类可以实现多个接口但只能继承一个抽象类;④接口中不能有静态方法,且定义的变量均为常量,抽象类中可以有静态方法且可以定义成员变量;⑤接口

2022-03-15 09:17:30 423

原创 JMM,Volatile关键字与Java多线程

0.引入 在开始讨论Volatile关键字与Java多线程之前,我们先回顾一下Java中线程的通信知识:①线程之间可以通过共享内存或基于网络进行通信(使用共享内存要求线程在同一主机下,不同主机之间的线程需要使用网络进行通信);②如果是通过共享内存的方式通信就要考虑并发,阻塞,唤醒问题。在Java中使用wait(),notify()可以实现阻塞与唤醒;③在网络通信时考虑并发问题主要通过加锁解决。 Tip:本博客对应学习视频,图文出处https://www.bilibi...

2022-03-10 20:52:41 310

原创 HashMap每次扩容和初始容量为什么都是2的次幂

总的来说HashMap每次扩容和初始容量都是2的次幂都是为了降低hash碰撞,提高HashMap的查找效率。在代码实现方面,每次初始创建HashMap时,在确认HashMap容量时,源码会先定义一个int h=1,然后进入一个where循环,循环条件为h<初始默认容量(不指定默认为16),循环体内只有一条语句,h=h<<1,即对h做移位运算,直至其大于初始默认容量,然后以h为容量。每次扩容时,都是直接在其现有容量基础上直接乘2。HashMap在存取元素时,都会用到&运算..

2022-03-08 11:00:28 996

原创 TCP与UDP的区别

TCP与UDP都是传输层的网络协议,其作用都是为了传送报文,但其依旧有许多的不同之处: ①TCP是面向连接的,而UDP是无连接的。所谓连接,可以简单的理解为在通信之前是否在双方之间建立一个“通道”。TCP在每次传输数据之前都会先在通信双方之间进行三次握手,确认通信双方状态后在发送数据,而UDP不会考虑这些,它会直接把报文发送给接收方,至于对方能不能接受到完整报文,则完全不考虑;②TCP传输过程是面向字节流的,而UDP则是面向报文的。简单来说,UDP在接受到报文后简单的为其添加头部后就会...

2022-03-07 21:06:10 2071

原创 HashMap的原理及扩容

1. 概述: HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null值,因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap是线程不安全的。2.HashMap原理 HashMap的底层实现在JDK1.8以前是通过hash表(数组实现)加链表实现的。每个输入的键值对会首先根据键值来确定它在数组上的唯一位置,然后在这个位置上存放一个链表用来存储具体的键...

2022-03-03 21:35:14 8280 1

原创 Nginx负载均衡的常用选择策略

Nginx负载均衡的常用选择策略:①轮询:Nginx根据请求发送来的顺序,依次把请求循环的发给列表中的服务器;②按权重:提前为每个服务器指定一个权重,Nginx在分配请求时会优先把请求分配给权重较高的服务器(一般选择给性能较好的服务器赋予较大的权重);③hash绑定:可以为每个ip地址使用hash绑定,这样每个访客访问的服务器固定,可以解决seeion存储问题;常见的用法是对用户的IP或者ID进行这个策略,然后「负载均衡器」就能保证同一个IP来源或者同一个用户永远会被送到同一个后端服务器上了,一

2022-03-03 20:38:54 2518

原创 如何获取CSDN积分和积分下载资源

获取C币下载网站资源

2022-03-03 09:23:12 682 25

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除