![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 84
珞珈山小杨
励志一直做一个有梦想的人
展开
-
深入理解volatile(Java)
前言除了上篇文章讲到的关键字synchronize关键字外可以实现同步外,java中还有另一个关键字volatile可以实现一些简单的同步。synchronized知识的了解可查看深入理解synchronized(一)——初识synchronized。定义volatile是一个特征修饰符.volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。其在许多语言中都有应用,在java中是一个关键字,其作用主要有以下两点:保证此变量对所有的线程的可见性。即一个线原创 2022-04-13 12:14:00 · 673 阅读 · 1 评论 -
深入理解synchronized(二)——synchronized实现原理
前言深入理解synchronized(一)——初识synchronized 在上一篇文章中,我们介绍了synchronized的作用以及用法,本文我们来探究下synchronized到底如何实现在对象加锁的。MonitorMonitor可以理解为一个同步工具,也可以描述为一种同步机制,它通常被描述为一个对象。与一切皆对象一样,所有的Java对象是天生的Monitor,每一个Java对象都有成为Monitor的潜质,因为在Java的设计中 ,每一个Java对象自打娘胎里出来就带了一把看不见的锁,它叫做原创 2022-04-10 20:17:30 · 577 阅读 · 0 评论 -
深入理解synchronized(一)——初识synchronized
synchronizedsynchronized是java中的一个关键字,简单来说,synchronized关键字以同步方法和同步代码块的方式,为方法和代码块上的对象加锁。使得同一时刻,在这个对象上的多个线程,只能由持有这个对象锁的单个线程进行代码的调用执行,本文将介绍为什么要加锁以及synchronized的用法以及使用上的区别。为什么要加锁?简单的说,加锁是为了避免多线程下并发冲突,锁是一种数据保护机制,可允许某一个线程(进程)进行操作锁,当文件锁上时,其他线程(进程)根据锁的性质(读写锁,阻塞非原创 2022-04-10 00:28:59 · 765 阅读 · 0 评论 -
深入理解Kafka
深入理解kafka的设计思想原创 2022-04-06 15:40:28 · 2601 阅读 · 0 评论 -
一个Java程序的一生(编译-加载-执行)
前言学习Java也不短的日子了,总想写些东西纪录下学习的过程,不如就从Java程序的一生开始谈起吧。Java程序的一生一个Java程序,从被我们编辑的.java文件,到执行程序,完成我们想要的功能。这中间发生了哪些有趣的事情呢,让我们来一探究竟!简单来说可以分为以下几个过程:编写源代码即.java文件编译.java文件生成字节码.class文件jvm虚拟机通过类加载器加载.class文件jvm通过执行引擎找到main()方法入口,执行代码编译字节码...原创 2021-02-23 00:30:36 · 243 阅读 · 0 评论 -
idea启动项目zookeeper报错
idea启动时zookeeper报错java.lang.IllegalArgumentException: Unable to canonicalize address 172.22.8.9/:2181 because it’s not resolvable原因:使用jdk14导致的不兼容,换成jdk1.8后解决原创 2021-02-21 23:52:46 · 4154 阅读 · 0 评论 -
Spring源码----Idea阅读环境搭建
前言搭建Idea环境阅读Spring源码1.Spring源码的下载可以去我的github地址下载:spring官方源码https://github.com/tigerchicken/spring-framework2.Spring源码的编译windows下需要安装gradlegradle的下载地址为https://gradle.org/install/下载完成后配置好对应的环境变量...原创 2019-04-15 16:52:20 · 334 阅读 · 0 评论 -
牛客网剑指offer题解(66题)
import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.PriorityQueue;import java.util.Queue;import ja...原创 2019-04-26 14:48:39 · 354 阅读 · 0 评论 -
JAVA重点(扫盲)知识
JAVA基础1.面向过程与面向对象面向过程优点:性能高(因为面向对象类调用时需要实例化,开销大,消耗资源)缺点:没有面型对象易维护 易复用 易扩展面向对象优点:易维护 易复用 易扩展,具有封装多态继承的特性,可以设计出低耦合的系统,是系统更加灵活和更加易于维护缺点:性能低2.Java语言的特点简单易学;面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关...原创 2019-06-14 16:47:24 · 538 阅读 · 0 评论 -
JAVA重点(扫盲)知识
JAVA基础1.面向过程与面向对象面向过程优点:性能高(因为面向对象类调用时需要实例化,开销大,消耗资源)缺点:没有面型对象易维护 易复用 易扩展面向对象优点:易维护 易复用 易扩展,具有封装多态继承的特性,可以设计出低耦合的系统,是系统更加灵活和更加易于维护缺点:性能低2.Java语言的特点简单易学;面向对象(封装,继承,多态);平台无关性( Java 虚拟机实现平台无关...原创 2019-06-16 16:46:16 · 141 阅读 · 0 评论 -
JAVA重点(扫盲)知识
JAVA基础文章目录JAVA基础1.面向过程与面向对象面向过程面向对象2.Java语言的特点3.JVM,JDK,与JREJVMJDK与JRE4.Oracle JDK与Open JDK5.Java和C++的区别6. Java 程序的主类 应用程序和小程序的主类有何不同?7. Java 应用程序与小程序之间有那些差别?8.字符型常量和字符串常量的区别?9.构造器 Constructor 是否可被 o...原创 2019-06-18 13:24:04 · 175 阅读 · 0 评论 -
RabbitMQ原理剖析
RabbitMQ原理剖析都知道RabbitMQ是消息队列,是一种应用程序对应用程序的通信方法;应用程序通过读写消息对列来进行通信,而无需专用连接来链接他们。RabbitMQ的网络架构图可以看到,大致过程是数据发布者发布数据给Exchange,Exchange接受数据后与对应Queue Binding,然后消费者与Queue建立连接Connection,通过通道消费Queue中的消息。可...原创 2019-06-27 15:16:12 · 320 阅读 · 0 评论 -
操作系统面试(内存管理)
操作系统面试(内存管理)虚拟内存虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。为了更好的管理内存,操作系统将内存抽象成地址空间。每个程序拥有自己的地址空间,这个地址空间被分割成多个块,每一块称为一页。这些页被映射到物理内存,但不需要映射到连续的物理内存,也不需要所有页都必须在物理内存中。当程序引用到不在物理内存中的页时,由硬件执行必要的映射,将缺失的部分装...原创 2019-07-03 21:54:54 · 603 阅读 · 0 评论 -
Kafka学习笔记
Kafaka 基本概念物理概念逻辑概念Producer:消息和数据的生产者,向Kafka的一个topic发布消息的进程/代码/服务Consumer:消息和数据的消费者,订阅数据(Topic)并且处理其发布的消息的进程/代码/服务Consumer Group:逻辑概念,对于一个topic,会广播给不同的group,一个group中只有一个consumer可以消费该消息。Br...原创 2019-04-11 15:29:35 · 223 阅读 · 0 评论 -
LinkedHashSet源码解析
Hash table and linked list implementation of the Set interface,with predictable iteration order.与HashSet的不同是,它保持了在记录之间的双向链表关系。LinkedHashSe能保持了插入时的顺序,并且重插入对顺序不影响。复制setvoid foo(Set s) { * S...原创 2019-03-28 10:19:32 · 106 阅读 · 0 评论 -
JAVA static与final关键字
在java开发中,我们经常会用到static与final关键字,看过很多遍,总是会忘记,下面来总结一下static关键字的使用1.修饰成员变量用static关键字修饰的变量称之为静态变量。而静态变量与非静态变量的区别主要在于:静态变量:被所有的对象所共享,在内存中只存在一个副本,只在类初次加载时被初始化。非静态变量:有对象所拥有,在对象创建时初始化,存在多个副本,各个对象拥有的副本互不...原创 2019-02-21 14:11:00 · 116 阅读 · 0 评论 -
synchronized的功能的扩展:重入锁
重入锁重入锁可以说是synchronized,Object.wait(),Object.notify()的一种替代品。在JDK5的早期版本,重入锁的新能要比synchronized好很多,在JDK6后对synchronized进行可很多优化,使得他和重入锁的性能差距并不大。重入锁使用java.util.concurrent.locks.ReentrantLock类实现,下面我么来看下重入锁...原创 2019-02-15 20:02:08 · 90 阅读 · 0 评论 -
信号量Semaphore
允许多个线程同时访问:信号量(Semaphore)信号量为多线程协作提供了更为强大的控制方法。广义上说,信号量是对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一个资源,而信号量指定多个线程访问同一个资源。信号主要提供以下的构造函数。public Semaphore(int permits);//permits 指定信号量的准入数...原创 2019-02-16 14:31:38 · 252 阅读 · 0 评论 -
Java虚拟机入门
前言最近在学习java并发,有些地方涉及到java虚拟机的知识,学习java这么久了,其实还没了解过Java虚拟机,这有点说不过去,所以先来学学习下java虚拟机的基础知识。java虚拟机的概述oracle官方定义的java技术体系包含以下几种:java程序设计语言各种平台的java虚拟机Class文件格式java API类库第三方java类库我们通常所说的JDK(Java ...转载 2019-02-17 23:00:49 · 215 阅读 · 0 评论 -
Java8与高并发(上:函数式编程)
前言2014年,Oracle发布了Java8新版本。这对java来说是一个里程碑式的版本。他最主要的改进就是增加了函数式编程的功能(为了解决java程序总是冗长的问题),或许会感到奇怪,函数式编程和并发似乎没什么关系,但是java中与并发相关的API的实现,却是以函数式编程的范式来实现的。所以为了更好的理解这些功能,需要先学习下函数式编程。java8的函数式编程函数作为一等公民我理解的,一...原创 2019-02-18 22:08:02 · 1733 阅读 · 0 评论 -
Java8与高并发(下)
前言上篇我们讲了java8的函数式编程,接下来我们谈谈java8的高并发内容。并行流与并行排序java8中可以在接口不变的情况下,将流改为并行流。这样就可以自然的使用多线程进行集合中的数据处理。使用并行流过滤数据下面代码是使用并行流统计质数的程序import java.util.stream.IntStream;public class PrimeUtil { public st...原创 2019-02-19 16:55:05 · 323 阅读 · 0 评论 -
JAVA虚拟机 自动内存管理机制(一)
运行时数据区域java虚拟机在执行java程序的过程中会把他所管理的内存划分为若干个不同数据区域。有的区域随着虚拟机进程的启动而存在,而有的区域依赖用户的线程的启动与结束而建立和销毁。java虚拟机所管理的内存主要包括以下几个运行时的数据区域。程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解...原创 2019-03-06 12:44:31 · 240 阅读 · 0 评论 -
堆排序算法
##堆的定义堆是一颗二叉完全树,可氛围大根堆与小根堆。大根堆:左右子节点的值小于其父节点的值。小根堆:左右子节点的值大于父节点的值。堆排序的实现(以数组为例,建立大根堆,父节点为a[i]时,则左右子节点分别为a[2i+1]与a[2i+2])建立堆:找到第一个非叶节点,调整该以节点为跟的子树为大根堆,在一次调整其他非叶节点,直到根节点。排序:将堆的根节点,与尾节点交换(即交换数组第...原创 2019-03-15 12:55:31 · 125 阅读 · 0 评论 -
Spring入门——DI与AOP简介
前言在诞生之初,创建Spring的主要目的是用赖替代更加重量级的企业级java技术,尤其是EJB。相对于EJB来说,Spring提供了更加轻量级和简单的编程模型。他增强了简单老式java对象POJO的功能,使其具备了之前只有EJB和其他企业级Java规范才具有的功能。简化java开发为了降低java开发的复杂性,Spring采取了以下4中关键策略:基于POJO的轻量级和最小侵入性编程;...原创 2019-03-12 16:05:22 · 379 阅读 · 0 评论 -
Spring----装配Bean的容器
Spring容器作用Spring容器负责创建对象,装配对象,配置他们并负责管理他们的整个生命周期,从生存到死亡。容器分为两种,一是Bean工厂,提供基本的DI支持(目前过于低级一般不再使用)二是应用上下文,基于Bean工厂构建,并提供应用框架级别的服务。下面介绍应用上下文应用上下文以下是集中常见的Spring应用上下文:1、AnnotationConfigApplicationCon...原创 2019-03-12 16:23:36 · 167 阅读 · 0 评论 -
Java位运算
java的位运算运算符号左移 <<右移 >>无符号右移 >>>与或非 & | ~异或 ^正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)注意:笔者在这里说的是右移,高位补位的情况。正数或者负数左移,低位都是用0补。(自行测试)...原创 2019-03-31 21:05:08 · 98 阅读 · 0 评论 -
LinkedHashMap源码分析
实现Hash table and linked list implementation of the Map interface,with predictable iteration order是对map接口的一种实现。是一个双向的链表实现特点保留了插入顺序由linked list定义了迭代顺序由插入时的顺序定义,但是重新插入不会影响原先顺序。迭代遍历LinkedHashMap的迭代...原创 2019-03-28 10:01:30 · 111 阅读 · 0 评论 -
线程的常用操作方法(JAVA)
线程的常用操作方法(JAVA)线程的命名和取得线程的命名和取得多线程的运行状态一般都是不确定的,我们为了能在程序开发过程中获取到一些需要使用的线程,就需要通过线程的名字。Thread类终究提供有线程名称的一些方法。例如【1】构造方法:public Thread(Runnable target,String name)【2】设置名称:public final void setName(Str...原创 2019-02-18 20:14:10 · 73 阅读 · 0 评论