![](https://img-blog.csdnimg.cn/20200409111125710.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
JavaSE
文章平均质量分 68
JAVASE学习笔记
你的酒窝里有酒
加油!!!
展开
-
线程池源码分析
线程池源码分析线程池的核心类是ThreadPoolExecutor,该类中有一个AtomicInteger类型的变量,其高三位用来表示线程池的状态,低29位表示线程池中线程的个数。线程池总共有如下几种状态,用高三位来表示: private static final int RUNNING = -1 << COUNT_BITS; private static final int SHUTDOWN = 0 << COUNT_BITS; privat原创 2021-04-18 09:59:30 · 175 阅读 · 0 评论 -
ReentrantReadWriteLock分析
ReentrantReadWriteLock分析依然使用state变量表示锁的获取状态,因为读写锁涉及读锁和写锁,因此用state变量的高16位和低16位作为区分,分别代表读锁的获取次数,以及写锁的重入次数。1、写锁加锁过程 protected final boolean tryAcquire(int acquires) { // 当前获取锁的线程 Thread current = Thread.currentThread(); //原创 2021-04-05 13:35:33 · 132 阅读 · 0 评论 -
LockSupport工具类
LockSupport工具类主要用来,阻塞和唤醒线程,可以方便的用来实现线程间的通信,public class LockDemo { static final Logger LOGGER = LoggerFactory.getLogger(LockDemo.class); static volatile Object result = null; public static void main(String[] args) throws InterruptedException原创 2021-04-04 21:22:35 · 90 阅读 · 0 评论 -
Java垃圾回收器
JVM垃圾回收器JVM垃圾回收算法只是一种思想,一种方法论,而垃圾回收器是垃圾回收的具体实现。1、Serival收集器串行收集器,是最古老,最稳定的垃圾收集器,效率也比较高。单线程收集需要暂停用户线程新生代复制算法,老年代标记整理算法参数控制:-XX:+UseSerival串行收集器由于是单线程的原因,回收速度比较慢,可管理的堆内存空间比较小。2、ParNew收集器多线程版本的Serival收集器吞吐量比较高:并发收集,利用多核CPU的优势,大幅度降低gc时间。需要暂停用户线程原创 2020-11-04 22:26:53 · 274 阅读 · 0 评论 -
超市助手
项目名称超市助手项目功能管理人员核对信息(登陆验证)上架商品下架商品修改商品信息查看商品信息普通买家查看商品信息购买商品,添加订单退还商品,修改订单打印订单效果演示管理员登陆验证菜单上架商品客户菜单其它操作打印订单(将结果写入文件中)项目源码https://github.com/excellent01/Java-Co...原创 2019-05-09 20:51:12 · 248 阅读 · 0 评论 -
synchronized的底层实现原理及各种优化
synchronized实现原理及优化几个概念:并发并行同步线程安全synchronized概述synchronized,单词译为同步,是Java的内建锁,用来确保线程安全,是解决并发问题的一种重要手段。synchronized可以保证在多线程状态下,每次仅有一个线程访问共享资源。synchronized的作用主要有一下三个:原子性:线程互斥的访问同步代码块。可见性:sync...原创 2019-05-12 15:16:11 · 8773 阅读 · 4 评论 -
浅析用户线程与守护线程
用户线程与守护线程守护线程相对于用户线程而言是比较特殊的一类线程,通常自己创建的线程在不做任何处理之前都属于是用户线程。而守护线程之所以称为守护线程,就是因为它的守护特性,怎么个守护法呢?守护线程是用来守护用户线程的,只有当JVM进程中,所有的用户线程执行完毕之后,守护线程才会和JVM进程一同结束。简单而言,两者的主要区别就是线程的生命周期不同。通过代码理解守护线程与用户线程创建一个用...原创 2019-05-08 23:12:25 · 352 阅读 · 0 评论 -
虚拟机类加载机制
类的加载过程类的加载过程总共分为加载,验证,准备,解析,初始化,使用,卸载这几个步骤。其中验证,准备,解析,统称为连接阶段。第一步:加载这里的加载不代表类的加载的全过程,它比较局限而且该过程是和连接阶段是交替执行的,总共分为三个步骤:通过类的全名称(包名.类名),将与之对应的字节流读取到内存中。获取的过程不局限于Class文件,它可以从任何地方获取。将字节流中的存储结构,转化为特定的...原创 2019-05-08 17:50:53 · 451 阅读 · 0 评论 -
JVM垃圾回收算法
JVM垃圾回收算法两个概念:新生代:存放生命周期较短的对象的区域。老年代:存放生命周期较长的对象的区域。相同点: 都在Java堆上1.标记–清除算法执行步骤:标记:遍历内存区域,对需要回收的对象打上标记。清除:再次遍历内存,对已经标记过的内存进行回收。图解:缺点:效率问题;遍历了两次内存空间(第一次标记,第二次清除)。空间问题:容易产生大量内存碎片,当再需要一块比...原创 2019-09-04 11:02:28 · 15317 阅读 · 7 评论 -
Java多线程学习总结(一)--------线程的创建
进程与线程进程: 运行的程序就称为进程,进程是资源分配的最小单位。每个进程都有自己的一套变量,但多个进程共享计算机的资源。线程:同一个程序同时执行多个任务,每一个任务都是一个线程,线程是CPU调度和执行的最小单位,线程共享进程的资源,但每个线程也有属于自己的独立资源如栈,程序计数器,线程ID等。主要区别线程是轻量级的进程,线程的启动和撤销所花费的开销远远小于进程的启动和撤销花费的开销。进...原创 2019-04-20 16:22:25 · 275 阅读 · 0 评论 -
Java学习总结------IO流
JavaIO流概述Java中对文件内容的操作需要使用IO流,I : Input 输入,O Output 输出 流: 数据的传输。IO流的分类按照数据流的传输方向:分为 输入流,和输出流Tips:此处的输入输出都是以程序作为参照物的,文件数据读入程序即为输入,程序数据写入内存即为输出。按照数据流的数据单位: 分为 字节流,字符流字节流:按照单个字节进行读写,即8个bit。字符流:按照...原创 2019-04-20 14:35:06 · 280 阅读 · 0 评论 -
JVM内存管理
JVM 内存区域线程私有区域程序计数器程序计数器,是一块较小的内存空间,记录当前线程执行到的字节码的行号,方便该线程再次被CPU调度时的继续执行,否则就会找不到上一次执行到哪个位置。但是如果线程执行的是本地方法,则该值为空。线程与线程之间是独立的,因此每个线程都应该具备一个属于自己的程序计数器,方便下次的CPU调度时,找到上次执行到的位置。因为程序计数器只记录字节码的行号,因此所占内存空...原创 2019-09-04 11:04:45 · 672 阅读 · 0 评论 -
Java学习总结--------比较器
比较器比较器是自己定义的一种大小的判断标准,在对自定义的类型排序往往要用到比较器,类似于C++中对大于,小于,等于的运算符重载。1.外部比较器java.util.Comparator;该接口内部提供有一个int compare(T o1, T o2);方法,我们可以通过实现该接口,然后覆写该接口的compare方法来实现外部比较器。其中该方法的返回值总公有三种情况:大于0,表示 o1 ...原创 2019-04-24 09:23:50 · 554 阅读 · 0 评论 -
JDK,JRE,JVM的区别与联系
JDK,JRE,JVM的区别与联系JDK(Java Development ToolKit) java 开发工具JDK是Java语言的软件开发工具包SDK。针对java开发者使用,整个Java的核心,包括Java运行环境JRE,Java工具(编译器,打包压缩工具,调试工具,反编译工具),和Java基础类库等。JRE(Java Runtime Environment) Java运行环境Jav...原创 2019-05-02 21:04:26 · 179 阅读 · 0 评论 -
浅析CAS操作
浅析CAS操作CAS机制CAS是是Compare And Swap 的缩写,翻译过来就是比较交换。CAS是Java并发编程的核心组成部分,不论是synchronized的各种优化,还是lock系列的锁,都离不开CAS。CAS操作是一种乐观锁策略。CAS是一个原子操作,虽然有比较和交换操作,这个是硬件指令集的支撑,在JDK1.5之后,虚拟机才可以使用处理器提供的CMPXCHG指令实现。CAS...原创 2019-05-01 14:03:44 · 309 阅读 · 0 评论 -
深入理解volatile关键字
深入理解volatile关键字1.volatile与可见性都知道volatile可以保证可见性,那么到底是如何保证的呢?这便于Happen-before原则有关,该原则的第三条规定:对一个volatile修饰的变量,写操作要早于对这个变量的读操作。具体步骤如下:A线程将共享变量读进主内存中,同时B线程也将共享变量读进工作内存中。在A线程对共享变量修改后,会立即刷新到主内存,此时B线程的...原创 2019-09-04 11:00:55 · 2009 阅读 · 2 评论 -
Java中的各种锁
锁公平锁与非公平锁公平锁是指在多线程并发访问共享资源的时候,会按照申请锁的顺序来获取锁。一般底层会使用一个队列,利用队列的FIFO特性来维护公平性,这样会杜绝并发时的的“饥饿”问题。非公平锁是指多线程访问共享资源的时候,并不按照申请锁的顺序来获取锁,即后来的先获取,这样会造成优先级反转和饥饿现象。在Java中的Synchronized就是典型的非公平锁。通过ReentrantLock的构...原创 2019-07-24 10:23:08 · 379 阅读 · 0 评论 -
execute与submit
Execute与Submit这两个方法都是向线程池提交任务时要调用的方法,那么这两个方法到底有什么区别呢?线程池execute方法源码分析public void execute(Runnable command) { // 判空处理 if (command == null) throw new NullPointerException(); // 获取...原创 2019-09-04 11:06:38 · 773 阅读 · 0 评论 -
线程死锁
死锁(DeadLock)死锁概述线程死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于synchronized的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死等下去,因此这便造成了死锁。死锁产生的条件互斥条件:一个资源,或者说一个锁只能被一个线程所占用,当一个线程首先获取到这个锁之后,在该线程释放这个锁之前,其它线程...原创 2019-09-04 11:06:03 · 15051 阅读 · 0 评论 -
Future模式
Future模式Future模式是多线程开发中的一种常见的设计模式,核心思想异步调用,让串行化的问题变得并行处理节省时间。当程序执行一个任务时,这个任务可能执行的很慢,它不可能立即返回结果,但可以返回一个契约,因此我们可以在该任务执行的时候,再去执行其它任务,最终用该契约获取结果。举个例子:在网上买了一部手机,手机三天后才会到货,但会马上产生一个订单,这个订单就是上述所提到的契约,然后我们不用...原创 2019-05-17 18:32:10 · 427 阅读 · 0 评论 -
Java线程池
线程池在Java中,可以通过继承Thread类,实现Runnable接口,或者实现Calable接口来实现多线程,但都存在一个问题,通过以上三种方式创建的线程在任务执行完毕之后,会自动终止。线程虽然是轻量级的,但也要占用空间,消耗资源,频繁的创建和撤销必然会导致性能的下降,给GC带来压力,而且很有可能会抛出OOM错误。为了解决这个问题,因而引入了线程池。线程池时典型的生产者消费者模式,提交任务的...原创 2019-05-17 08:34:15 · 137 阅读 · 0 评论 -
线程间通信-------生产者消费者模型
生产者消费者模型概述生产者消费者模式,是通过一块缓冲区作为仓库,来解决生产者和消费者之间的强耦合关系。通俗来讲就是,在该模型之前,只有当顾客来了,店家才会生产商品,这样的话,来多个顾客就会将大量时间浪费在排队上,白白消磨时间。而有了生产者消费者模式后呢?店家在没有顾客的时候,也生产商品,并将商品放在一个容器中,顾客来了直接拿即可,只有当容器满了便停止生产。而生活中大多都是这个模型。图解使...原创 2019-05-12 21:31:27 · 421 阅读 · 0 评论 -
多线程聊天室
项目名称多线程聊天室项目简介多个用户可以在同一局域网下进行聊天.类图:项目执行流程客户端通过对应端口号,和IP地址t与服务器端建立连接后,进行注册,然后通过输入输出流,进行通信。服务器端收到信息后,进行解析,判断客户端的需求(私聊,群聊,下线等),从而进行相应的处理。因为采取多线程的方式,服务器端,线程比较多,采取线程池的方式进行处理。每个客户端仅需要一个发送...原创 2019-05-11 19:28:21 · 2307 阅读 · 1 评论 -
AQS详解
AQS详解AbstractQueuedSynchronizer(简称AQS,JUC包的核心),Lock系列,Semaphore,FutureTask,CountDownLatch,等等都是基于AQS实现的。AQS是Doug Lea 写的,Doug Lea被称为计算机界的艺术家。AQS----状态管理AQS底层使用一个int类型的成员变量来表示同步状态(非结点状态)private volati...原创 2019-05-21 00:08:18 · 333 阅读 · 0 评论 -
多线程练习题
多线程练习题1.写一段简单的程序,启动两个线程交替打印1–100题目分析:只打印1—100,为了保证数据的同步必须加锁,同时又需要线程交替打印,则需要线程间的通信。解题思想:启动两个线程A和线程B,两个线程交替打印,首先A打印,打印完,wait,释放对象锁,此时B获得对象锁,打印,且唤醒A,然后B wait ,反复执行。代码:/** * 两个线程交替输出1--100 * @aut...原创 2019-05-14 15:28:32 · 2337 阅读 · 0 评论 -
正确的停止一个已经启动线程
线程的停止总共有三种方法1.使用标志位,使得线程正常退出。覆写run方法使得其为一个死循环,通过更改标志位退出循环。代码演示:线程类:class TestThreadStop implements Runnable{ private boolean flag = true; // 标记位 public void setFlag(boolean flag) { ...原创 2019-04-23 16:21:08 · 255 阅读 · 0 评论 -
Java集合学习总结------ArrayList,LinkedList,Vector三者的区别
List接口List接口是Java集合框架下的重要组成部分。其中下面有三个重要的实现类:ArrayLIstLinkedListVectorList集合就是数据结构中的顺序表,相当于一个可变长的数组。由于引入了泛型因此可以存任意类型的对象。面试题:ArrayList,LinkedList,Vector三者的区别1.ArrayList和Vector底层都是数组,而LikedList底...原创 2019-04-27 22:01:09 · 473 阅读 · 0 评论 -
java学习总结-------String类(详解)
String详解String类型是继 byte char short int long float double 及boolean八大类型之外的又一重要类型,任何语言中都离不开它,String又称为字符串或者字符串常量。在任何语言的底层都不会提供直接的字符串类型,现在所谓的字符串类型只是高级语言为了给用户方便开发而已。在Java中字符串也是用字符数组来存放的。源码:private fina...原创 2019-01-09 22:10:09 · 390 阅读 · 1 评论 -
java学习总结--------接口
接口(interface)接口基本概念在Java中接口是一些全局常量,和公共的抽象方法的集合(jdk8以前),接口是一个纯粹的抽象类。接口的简单使用接口用interface关键字来定义。interface A { //定义一个接口 public static final Integer I = 10; //全局常量 public abstract void fun()...原创 2019-01-06 19:35:56 · 685 阅读 · 1 评论 -
java学习总结 ---------final关键字(附笔试题)
final关键字 -----(终结器)在Java中final可以用来修饰类,属性,和方法及局部变量。1.final修饰类:final又被称为终结器,被final修饰的类到此为止不能被继承。2.final修饰成员属性:final类似于C语言中的const,被final修饰表明该属性的值不能被修改,且必须声明时赋值,或者在构造器中赋值。3.final修饰方法:被final修饰的方法不能被覆写,...原创 2019-01-01 11:45:16 · 971 阅读 · 0 评论 -
Java学习总结-----内部类
什么是内部类?定义:内部类即是在一个类内部嵌套了其他类,我们把这些嵌套的类即称为内部类。内部类与外部类就如人与心脏,车与发动机之间的关系.。注:内部类里面可以在再嵌套类,一个类中可以嵌套多个内部类。为什么要有内部类?内部类的主要功能是弥补Java中不能多重继承的缺陷,其次内部类还可以方便的访问外部类的数据(所有包括private修饰的数据,且不依赖于对象),同时内部类可以实现对除外部类之...原创 2018-12-27 21:07:44 · 215 阅读 · 0 评论 -
java学习总结----抽象类
抽象类什么是抽象类定义:抽象类是子类的超集,抽象类仅是在普通类的基础上增加了一些抽象方法,且被abstratc修饰的类。什么是抽象方法呢?定义:没有方法体只有方法声明且被abstract修饰的方法。如: abstract void fun();注:这里的一些可以是0,即一个抽象类中可以不含任何抽象方法。因此含有抽象方法的类一定是抽象类,但不含抽象方法的类不一定不是抽象类。为...原创 2018-12-27 21:07:25 · 173 阅读 · 0 评论 -
Java学习总结------方法重载与方法覆写
方法重载(overlode)在同一个类中定义多个同名的方法就叫方法重载。方法重载的要求:方法与方法之间的名称相同,形参列表不同,与返回值类型无关。注:此处的形参列表不同指的是形参的个数或者类型不相同,有的书上也说形参的顺序不同也可以构成方法重载,其实形参顺序不同的本质还是形参类型的不同。为了避免混淆在 实际使用中尽量使得返回值类型一致。方法重载的作用:方法重载通常命名一组功能相似的方法...原创 2018-12-13 10:19:52 · 440 阅读 · 0 评论 -
构造块、构造方法、静态代码块的执行顺序问题(阿里笔试题)
什么是代码块?代码块既是用{ }括起来的一段代码。代码块的分类根据代码块的所处的位置以及修饰它的关键字,将代码块可分为以下四种:1.局部代码块概念:定义在方法中,用{ }括起来的一段代码。主要用来解决在方法中同名变量的定义问题。本质上是作用域和生命周期的问题。public class Test{ public static void main(String[] args)...原创 2018-12-08 18:22:40 · 374 阅读 · 1 评论 -
JavaSE数据类型与运算符
JavaSE基本数据类型Java是一种强类型语言,因此对于Java中的每一个变量都要声明一种类型。编写程序时,应在满足 要求的情况下,尽量选择合适的类型。注:凡是写出来的整型常量都会被看做int类型 凡是写出来的小数默认看做double类型。数据类型转换大的数据类型和小的数据类型在进行运算时,会被自动提升为大的数据类型。而大的数据类型变为小的数据类型时必须强制类型转换。public...原创 2018-11-30 15:46:25 · 199 阅读 · 0 评论 -
第一篇Java博客
大概花了一个月多的时间,把C语言的知识大概重新学习了一遍。虽然大一的时候曾经学过一遍,但不知道当时是什么原因对这些知识很难理解,当时也只是应付了一下考试。C语言三剑客《c和指针》,《c专家编程》,《c陷阱与缺陷》这几本书真的很厉害,里面有很多谭浩强的书中没有的知识,对整型提升,数据存储,数组和指针,字符数组和字符串,程序的结构,结构体的内存对齐,动态内存开辟,函数栈帧,柔性数组,文件等很多内容都都...原创 2018-11-30 09:53:16 · 165 阅读 · 0 评论 -
java学习总结------异常处理
异常介绍Java程序员在项目开发中,不可能将代码写得尽善尽美,即使写的尽善尽美也难以避免一些问题,如输入数据类型或者格式不匹配,读取的文件不存在,客户端与服务器通信网络堵塞等,这些问题都是在程序运行期间才会被发现,这些问题统称为异常。异常类的继承结构所有的异常都是由Throwable类继承而来,Throwable下边有两个子类分别是Error和Exception。Error类:描述Ja...原创 2019-01-16 13:02:01 · 281 阅读 · 0 评论 -
Java学习总结 ---------- 包装类
什么是包装类定义:将基本数据类型封装到类中,即形成包装类。包装类的作用包装类的功能主要是将基本数据类型转化为引用数据类型,以便于操作。使基本数据类型也可以被Object类接收。基本数据类型也可以存放在集合中。包装类中包含每种基本数据类型的相关属性如最大值,最小值等,以及一些操作方法。基本数据类型与之对应的包装类除了char和int的包装类需要单独记忆之外,其它的包装类名称都是...原创 2019-02-01 12:29:50 · 228 阅读 · 0 评论 -
Java集合学习总结-------Set接口
Set接口Set集合Java集合框架中的非常重要的组成部分。Set集合不能存重复的元素。这里的重复是根据该对象所属的类的equals方法和hashCode方法来判断的。只有当两个对象的hashcode相同,且equals方法返回true时,才断定两个对象相等。代码验证:import java.util.Objects;/** * @auther plg * @date 2019/4...原创 2019-04-27 21:10:10 · 302 阅读 · 0 评论 -
Java集合学习总结-----HashMap源码剖析
JDK1.8的HashMap源码刨析JDK1.8HashMap底层由桶数组+链表+红黑树三部分组成。红黑树是高度平衡的搜素二叉树,加红黑树的目的是为了提高查询效率,因为链表的查询时间复杂度O(n),而红黑树的查询时间复杂度为O(logN).。当N很大时,大大提高查询速率。主要属性//当不指定容量时,默认初始化容量16static final int DEFAULT_INITIAL_CAPA...原创 2019-04-22 20:33:46 · 584 阅读 · 0 评论