java基础
文章平均质量分 93
碌碌无为_心不在烟
这个作者很懒,什么都没留下…
展开
-
Netty对于粘包和拆包问题的解决方案
前言什么是粘包拆包?拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个数据包打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通讯的一端发送的数据包超过一次tcp报文所能传输的最大值时,就会将一个数据包拆成多个最大tcp长度的tcp报文分开传输,这就叫做拆包。我们看一下下面这张图就知道了:粘包拆包产生的原因数据流在TCP协议下传播,因为协议本身对于流有一些规则的限制,这些规则会导致当前对端接收到的数据包不原创 2021-03-15 23:02:22 · 836 阅读 · 1 评论 -
ConcurrentModificationException异常原因和解决方法
首先看一下一个例子举出 ConcurrentModificationException 的出现场景:public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(){ { add(1); add(2); add(3); } }; Iterator&原创 2021-02-25 23:59:17 · 89284 阅读 · 3 评论 -
java对象的内存构
java对象在内存中布局java通过 new 来创建一个实例对象,对象存于内存的堆中并给其分配一个内存地址,那么问题来了这个实例对象是以怎样的形态存在内存中的?一个Object对象在内存中占用多大?对象中的属性是如何在内存中分配的?在 JVM 中,Java对象保存在堆中时,由以下三部分组成:对象头(object header):包括了关于堆对象的布局、类型、GC状态、同步状态和标识哈希码的基本信息。Java对象和vm内部对象都有一个共同的对象头格式。实例数据(Instance D原创 2021-01-25 16:49:56 · 178 阅读 · 0 评论 -
浅谈阻塞队列的原理
阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmhzIyRO-1606749754423)(C:\Users\DELL\Ap原创 2020-11-30 23:24:20 · 546 阅读 · 0 评论 -
java的四种引用类型你知道吗?
前言Java的内存回收不需要程序员负责,JVM会在必要时启动Java GC完成垃圾回收。 Java以便我们控制对象的生存周期,提供给了我们四种引用方式,引用强度从强到弱分别为:强引用、软引用、弱引用、虚引用。JDK1.2以前只提供一种引用类型——强引用 Object obj = new Object();。而JDK1.2后我们多另外的三个选择分别是软引用 java.lang.ref.SoftReference、弱引用 java.lang.ref.WeakReference 和虚引用 java.lang原创 2020-11-22 11:22:41 · 129 阅读 · 0 评论 -
一文带你搞懂 ThreadLocal 的原理及使用
ThreadLocal 介绍ThreadLocal的使用常见 API使用ThreadLocal类与synchronized关键字的区别ThreadLocal 使用案例ThreadLocal的设计与源码解析核心结构设计ThreadLocalMap结构以及Hash冲突的解决方法ThreadLocalMap结构弱引用和内存泄漏ThreadLocal 介绍ThreadLocal 翻译过来是 本地线程,它的作用是为每一个线程创建一个副本,不同线程之间访问不..原创 2020-11-21 23:04:30 · 195 阅读 · 0 评论 -
八锁现象带你了解 synchronized 到底是锁什么?
什么是八锁现象?八锁现象就是加锁的地方不一样,像加在普通方法,静态方法等,可以帮我们搞懂锁锁住的东西是什么。第一种:标准情况下,两个线程先打印 发短信还是 打电话?//标准情况下,两个线程先打印 发短信还是 打电话? public class Test1 { public static void main(String[] args) { Phone phone = new Phone(); //锁的存在 new Thread(()-原创 2020-11-09 00:18:57 · 362 阅读 · 1 评论 -
java序列化,从底层到序列化所隐藏的问题以及解决方案
什么是序列化?序列化:将对象写入到IO流中,对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。核心作用是对象状态的保存与重建。反序列化:将IO流中恢复对象,客户端从文件中或网络上获得序列化后的对象字节流,根据字节流中所保存的对象状态及描述信息,通过反序列化重建对象。序列化的意义序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原创 2020-11-02 10:07:18 · 476 阅读 · 0 评论 -
Java泛型的原理和引发的问题你真的知道吗?
什么是泛型?JDK 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。Java泛型被引入的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动原创 2020-11-01 15:29:09 · 303 阅读 · 0 评论 -
你真的了解过 ConcurrentHashMap 吗?
首先,我们需要先了解一下 HashMap 和 HashTable。HashMap :是一个用于存储Key-Value键值对的集合,每一个键值对也叫做Entry。这些个键值对(Entry)分散存储在一个数组当中,这个数组就是HashMap的主干。在方法中都没有加锁或相关的锁机制,所有线程是不安全的。HashTable:和 HashMap 一样,只是它在方法上都加上了锁,保证了线程的安全,但是降低了速度。由于 HashMap 速度快,但是保证不了线程安全,而 HashTable 可以保证线程安全,但原创 2020-10-23 23:18:51 · 770 阅读 · 0 评论 -
深拷贝&浅拷贝 & 它们的实现
深拷贝&浅拷贝浅拷贝对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。对于数据类型是引用数据类型的成员变量,比如说成员变量是某个数组、某个类的对象等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存地址)复制一份给新的对象。实际上两个对象的该成员变量都指向同一个实例。深拷贝对于深拷贝来说,不仅要复制对象的所有基本数据类型的成员变量值原创 2020-10-18 00:04:55 · 220 阅读 · 6 评论 -
通过AQS看ReentrantLock的原理和实现
通过AQS看ReentrantLock的原理和实现什么是 AQS ?aqs全称为AbstractQueuedSynchronizer,AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLock、CountDownLatch等。AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的原创 2020-10-17 16:13:12 · 174 阅读 · 0 评论 -
浅谈 CAS 及其缺点和解决方案
什么是 CAS 机制?CAS 英文就是 compare and swap ,也就是比较并交换,首先它是一个原子操作,可以避免被其他线程打断。在Java并发中,我们最初接触的应该就是synchronized关键字了,但是synchronized属于重量级锁,很多时候会引起性能问题,虽然在新的JDK中对其已经进行了优化。volatile也是个不错的选择,但是volatile不能保证原子性,只能在某些场合下使用。那么问题来了,这个 CAS 机制是怎么在不加锁的情况下来保证共享资源的互斥呢?synchro原创 2020-10-14 23:36:27 · 2114 阅读 · 3 评论 -
JDK1.7 和 JDK1.8 中 HashMap 的不同你知道吗?
HashMap(哈希表)底层数据结构源码解析常量分析HashMap初始化put方法解析扩容机制底层数据结构HashMap 在 JDK 1.7 前是 数组+链表 的形式来存储,在 JDK 1.8 后是 数组+链表+红黑树上图为数组+链表的数据模型,每一个Node都是一个Node节点源码如下,每一个Node节点都是HashMap的一个存储单位,Node是HashMap的一个内部类,实现了Map.Entry接口,本质上就是一个键值对。存储数据的源码如下:原创 2020-10-12 16:51:38 · 192 阅读 · 0 评论 -
JDK 1.8 新特新
JDK 1.8 新特性函数式接口定义:所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口。Comparator接口、Runanle接口都是典型的函数式接口。特点:接口有且仅有一个抽象方法,如抽象方法compare允许定义静态非抽象方法。允许定义默认defalut非抽象方法(default方法也是java8才有的)允许java.lang.Object中的public方法,如方法equals。FunctionInterface注解不是必须的,如果一个接口符合"函数式接口"定义,那原创 2020-10-08 15:18:28 · 342 阅读 · 0 评论