
JavaSE
文章平均质量分 72
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 · 211 阅读 · 0 评论 -
ReentrantReadWriteLock分析
ReentrantReadWriteLock分析依然使用state变量表示锁的获取状态,因为读写锁涉及读锁和写锁,因此用state变量的高16位和低16位作为区分,分别代表读锁的获取次数,以及写锁的重入次数。1、写锁加锁过程 protected final boolean tryAcquire(int acquires) { // 当前获取锁的线程 Thread current = Thread.currentThread(); //原创 2021-04-05 13:35:33 · 168 阅读 · 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 · 102 阅读 · 0 评论 -
Java垃圾回收器
JVM垃圾回收器JVM垃圾回收算法只是一种思想,一种方法论,而垃圾回收器是垃圾回收的具体实现。1、Serival收集器串行收集器,是最古老,最稳定的垃圾收集器,效率也比较高。单线程收集需要暂停用户线程新生代复制算法,老年代标记整理算法参数控制:-XX:+UseSerival串行收集器由于是单线程的原因,回收速度比较慢,可管理的堆内存空间比较小。2、ParNew收集器多线程版本的Serival收集器吞吐量比较高:并发收集,利用多核CPU的优势,大幅度降低gc时间。需要暂停用户线程原创 2020-11-04 22:26:53 · 325 阅读 · 0 评论 -
execute与submit
Execute与Submit这两个方法都是向线程池提交任务时要调用的方法,那么这两个方法到底有什么区别呢?线程池execute方法源码分析public void execute(Runnable command) { // 判空处理 if (command == null) throw new NullPointerException(); // 获取...原创 2019-09-04 11:06:38 · 813 阅读 · 0 评论 -
线程死锁
死锁(DeadLock)死锁概述线程死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于synchronized的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死等下去,因此这便造成了死锁。死锁产生的条件互斥条件:一个资源,或者说一个锁只能被一个线程所占用,当一个线程首先获取到这个锁之后,在该线程释放这个锁之前,其它线程...原创 2019-09-04 11:06:03 · 15134 阅读 · 0 评论 -
JVM内存管理
JVM 内存区域线程私有区域程序计数器程序计数器,是一块较小的内存空间,记录当前线程执行到的字节码的行号,方便该线程再次被CPU调度时的继续执行,否则就会找不到上一次执行到哪个位置。但是如果线程执行的是本地方法,则该值为空。线程与线程之间是独立的,因此每个线程都应该具备一个属于自己的程序计数器,方便下次的CPU调度时,找到上次执行到的位置。因为程序计数器只记录字节码的行号,因此所占内存空...原创 2019-09-04 11:04:45 · 712 阅读 · 0 评论 -
JVM垃圾回收算法
JVM垃圾回收算法两个概念:新生代:存放生命周期较短的对象的区域。老年代:存放生命周期较长的对象的区域。相同点: 都在Java堆上1.标记–清除算法执行步骤:标记:遍历内存区域,对需要回收的对象打上标记。清除:再次遍历内存,对已经标记过的内存进行回收。图解:缺点:效率问题;遍历了两次内存空间(第一次标记,第二次清除)。空间问题:容易产生大量内存碎片,当再需要一块比...原创 2019-09-04 11:02:28 · 15592 阅读 · 7 评论 -
深入理解volatile关键字
深入理解volatile关键字1.volatile与可见性都知道volatile可以保证可见性,那么到底是如何保证的呢?这便于Happen-before原则有关,该原则的第三条规定:对一个volatile修饰的变量,写操作要早于对这个变量的读操作。具体步骤如下:A线程将共享变量读进主内存中,同时B线程也将共享变量读进工作内存中。在A线程对共享变量修改后,会立即刷新到主内存,此时B线程的...原创 2019-09-04 11:00:55 · 2042 阅读 · 2 评论 -
Java中的各种锁
锁公平锁与非公平锁公平锁是指在多线程并发访问共享资源的时候,会按照申请锁的顺序来获取锁。一般底层会使用一个队列,利用队列的FIFO特性来维护公平性,这样会杜绝并发时的的“饥饿”问题。非公平锁是指多线程访问共享资源的时候,并不按照申请锁的顺序来获取锁,即后来的先获取,这样会造成优先级反转和饥饿现象。在Java中的Synchronized就是典型的非公平锁。通过ReentrantLock的构...原创 2019-07-24 10:23:08 · 412 阅读 · 0 评论 -
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 · 379 阅读 · 0 评论 -
Future模式
Future模式Future模式是多线程开发中的一种常见的设计模式,核心思想异步调用,让串行化的问题变得并行处理节省时间。当程序执行一个任务时,这个任务可能执行的很慢,它不可能立即返回结果,但可以返回一个契约,因此我们可以在该任务执行的时候,再去执行其它任务,最终用该契约获取结果。举个例子:在网上买了一部手机,手机三天后才会到货,但会马上产生一个订单,这个订单就是上述所提到的契约,然后我们不用...原创 2019-05-17 18:32:10 · 453 阅读 · 0 评论 -
Java线程池
线程池在Java中,可以通过继承Thread类,实现Runnable接口,或者实现Calable接口来实现多线程,但都存在一个问题,通过以上三种方式创建的线程在任务执行完毕之后,会自动终止。线程虽然是轻量级的,但也要占用空间,消耗资源,频繁的创建和撤销必然会导致性能的下降,给GC带来压力,而且很有可能会抛出OOM错误。为了解决这个问题,因而引入了线程池。线程池时典型的生产者消费者模式,提交任务的...原创 2019-05-17 08:34:15 · 163 阅读 · 0 评论 -
多线程练习题
多线程练习题1.写一段简单的程序,启动两个线程交替打印1–100题目分析:只打印1—100,为了保证数据的同步必须加锁,同时又需要线程交替打印,则需要线程间的通信。解题思想:启动两个线程A和线程B,两个线程交替打印,首先A打印,打印完,wait,释放对象锁,此时B获得对象锁,打印,且唤醒A,然后B wait ,反复执行。代码:/** * 两个线程交替输出1--100 * @aut...原创 2019-05-14 15:28:32 · 2408 阅读 · 0 评论 -
线程间通信-------生产者消费者模型
生产者消费者模型概述生产者消费者模式,是通过一块缓冲区作为仓库,来解决生产者和消费者之间的强耦合关系。通俗来讲就是,在该模型之前,只有当顾客来了,店家才会生产商品,这样的话,来多个顾客就会将大量时间浪费在排队上,白白消磨时间。而有了生产者消费者模式后呢?店家在没有顾客的时候,也生产商品,并将商品放在一个容器中,顾客来了直接拿即可,只有当容器满了便停止生产。而生活中大多都是这个模型。图解使...原创 2019-05-12 21:31:27 · 452 阅读 · 0 评论 -
synchronized的底层实现原理及各种优化
synchronized实现原理及优化几个概念:并发并行同步线程安全synchronized概述synchronized,单词译为同步,是Java的内建锁,用来确保线程安全,是解决并发问题的一种重要手段。synchronized可以保证在多线程状态下,每次仅有一个线程访问共享资源。synchronized的作用主要有一下三个:原子性:线程互斥的访问同步代码块。可见性:sync...原创 2019-05-12 15:16:11 · 8868 阅读 · 4 评论 -
多线程聊天室
项目名称多线程聊天室项目简介多个用户可以在同一局域网下进行聊天.类图:项目执行流程客户端通过对应端口号,和IP地址t与服务器端建立连接后,进行注册,然后通过输入输出流,进行通信。服务器端收到信息后,进行解析,判断客户端的需求(私聊,群聊,下线等),从而进行相应的处理。因为采取多线程的方式,服务器端,线程比较多,采取线程池的方式进行处理。每个客户端仅需要一个发送...原创 2019-05-11 19:28:21 · 2367 阅读 · 1 评论 -
超市助手
项目名称超市助手项目功能管理人员核对信息(登陆验证)上架商品下架商品修改商品信息查看商品信息普通买家查看商品信息购买商品,添加订单退还商品,修改订单打印订单效果演示管理员登陆验证菜单上架商品客户菜单其它操作打印订单(将结果写入文件中)项目源码https://github.com/excellent01/Java-Co...原创 2019-05-09 20:51:12 · 269 阅读 · 0 评论 -
浅析用户线程与守护线程
用户线程与守护线程守护线程相对于用户线程而言是比较特殊的一类线程,通常自己创建的线程在不做任何处理之前都属于是用户线程。而守护线程之所以称为守护线程,就是因为它的守护特性,怎么个守护法呢?守护线程是用来守护用户线程的,只有当JVM进程中,所有的用户线程执行完毕之后,守护线程才会和JVM进程一同结束。简单而言,两者的主要区别就是线程的生命周期不同。通过代码理解守护线程与用户线程创建一个用...原创 2019-05-08 23:12:25 · 381 阅读 · 0 评论 -
虚拟机类加载机制
类的加载过程类的加载过程总共分为加载,验证,准备,解析,初始化,使用,卸载这几个步骤。其中验证,准备,解析,统称为连接阶段。第一步:加载这里的加载不代表类的加载的全过程,它比较局限而且该过程是和连接阶段是交替执行的,总共分为三个步骤:通过类的全名称(包名.类名),将与之对应的字节流读取到内存中。获取的过程不局限于Class文件,它可以从任何地方获取。将字节流中的存储结构,转化为特定的...原创 2019-05-08 17:50:53 · 503 阅读 · 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 · 194 阅读 · 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 · 332 阅读 · 0 评论 -
Java集合学习总结------ArrayList,LinkedList,Vector三者的区别
List接口List接口是Java集合框架下的重要组成部分。其中下面有三个重要的实现类:ArrayLIstLinkedListVectorList集合就是数据结构中的顺序表,相当于一个可变长的数组。由于引入了泛型因此可以存任意类型的对象。面试题:ArrayList,LinkedList,Vector三者的区别1.ArrayList和Vector底层都是数组,而LikedList底...原创 2019-04-27 22:01:09 · 500 阅读 · 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 · 342 阅读 · 0 评论 -
Java同步处理之synchronized关键字
同步问题的引出有这么一段简单的代码,定义一个Runnable接口实现类,覆写run方法,其中该类中有一个属性num,默认为0,run方法功能是让num自加10000次,主方法中创建两个线程都执行此代码,执行完之后,在通过主线程输出num的值,为了确保打印语句在两个线程都执行完毕执行再输出,因此让两个线程都调用join方法。public class TestDaemon implements R...原创 2019-04-26 22:42:28 · 368 阅读 · 0 评论 -
Java集合学习总结-----Map集合遍历的主要方式
Map集合的遍历的几种方式数据准备Map<String,Integer> map = new HashMap<>();map.put("Tom",22);map.put("Jack",20);map.put("Lucy",18);1.toString()遍历System.out.println("toString遍历:");System.out.printl...原创 2019-04-25 20:27:37 · 1495 阅读 · 0 评论 -
Java集合学习总结-----List集合遍历的主要方式
List集合的遍历数据准备public static void main(String[] args) { List<String> list = new LinkedList<>(); list.add("Java"); list.add("C++"); list.add("Python"); list.add("PHP");...原创 2019-04-25 19:48:00 · 217 阅读 · 0 评论 -
Java学习总结--------比较器
比较器比较器是自己定义的一种大小的判断标准,在对自定义的类型排序往往要用到比较器,类似于C++中对大于,小于,等于的运算符重载。1.外部比较器java.util.Comparator;该接口内部提供有一个int compare(T o1, T o2);方法,我们可以通过实现该接口,然后覆写该接口的compare方法来实现外部比较器。其中该方法的返回值总公有三种情况:大于0,表示 o1 ...原创 2019-04-24 09:23:50 · 600 阅读 · 0 评论 -
正确的停止一个已经启动线程
线程的停止总共有三种方法1.使用标志位,使得线程正常退出。覆写run方法使得其为一个死循环,通过更改标志位退出循环。代码演示:线程类:class TestThreadStop implements Runnable{ private boolean flag = true; // 标记位 public void setFlag(boolean flag) { ...原创 2019-04-23 16:21:08 · 376 阅读 · 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 · 603 阅读 · 0 评论 -
JavaIO学习总结-------序列化
序列化与反序列化序列化:将对象转换为一个字节流的过程称为序列化。反序列化:将字节流恢复为对象的过程称为对象的反序列化。序列化的条件一个类的对象若想序列化,该类必须实现java.io.Serializable接口,该接口是一个标识接口,接口中没有任何方法或者属性。仅仅是表明实现该接口的类可以被序列化。序列化步骤首先要有一个待序列化的对象,且该对象所处的类实现了Serializable接...原创 2019-04-21 20:11:29 · 486 阅读 · 0 评论 -
Java多线程学习总结(一)--------线程的创建
进程与线程进程: 运行的程序就称为进程,进程是资源分配的最小单位。每个进程都有自己的一套变量,但多个进程共享计算机的资源。线程:同一个程序同时执行多个任务,每一个任务都是一个线程,线程是CPU调度和执行的最小单位,线程共享进程的资源,但每个线程也有属于自己的独立资源如栈,程序计数器,线程ID等。主要区别线程是轻量级的进程,线程的启动和撤销所花费的开销远远小于进程的启动和撤销花费的开销。进...原创 2019-04-20 16:22:25 · 290 阅读 · 0 评论 -
Java学习总结------IO流
JavaIO流概述Java中对文件内容的操作需要使用IO流,I : Input 输入,O Output 输出 流: 数据的传输。IO流的分类按照数据流的传输方向:分为 输入流,和输出流Tips:此处的输入输出都是以程序作为参照物的,文件数据读入程序即为输入,程序数据写入内存即为输出。按照数据流的数据单位: 分为 字节流,字符流字节流:按照单个字节进行读写,即8个bit。字符流:按照...原创 2019-04-20 14:35:06 · 297 阅读 · 0 评论 -
Java学习总结------File类
Java中的File类Java中对象至上,因此Java内部将操作系统中对文件的操作抽象成一个类,就是所谓的File类。该类提供了一些方法供用户使用,以至于通过程序来操纵文件。但该类并不能对文件的内容做任何操作,对文件的内容的操作需要用到IO流。主要的构造方法1.File(String pathname)将给定的字符串作为文件路径,来创建File实例eg:String pathname...原创 2019-04-17 20:12:20 · 604 阅读 · 0 评论 -
Lambda表达式
Lambda表达式的由来Lambda表达式,产于JDK8,使得Java能够支持简单的函数式编程。主要原因还是面向对象编程太过完整,结构操作不明确,代码太过冗余。代码说明计算两个整型的和的方法,完全按照Java中对象至上的观念,先定义一个接口,接口中提供抽象方法,然后再定义接口实现类。###### 定义接口:interface Add{ int add(int a,int b);...原创 2019-04-13 13:46:03 · 366 阅读 · 0 评论 -
IO流练习------文件拷贝
利用IO流实现文件的拷贝核心思想将源文件读入到内存中将读入的数据写入目标文件其中,不需要将源文件的数据彻底读入完才进行写入目标文件。这样做一方面效率很低,而且当文件很大内存容纳不了时,就会出现问题。因此采用边读边写的方式进行文件拷贝.图示:具体步骤进行路径校验用户传进来源文件和目标文件的路径,以字符串的形式,因此很有必要对传入的路径进行校验。校验规则:源文件必须存在,...原创 2019-04-09 18:27:14 · 473 阅读 · 0 评论 -
Java学习总结------反射
Java的反射机制反射是Java语言的特征之一。在运行状态下,对于任意一个类都可以获取其中的属性和方法,对于任意一个对象,都能够调用它的任意一个方法,访问它的任意属性;这种动态的获取类的信息,及调用对象方法的功能称为Java的反射机制。Class类Class类是反射中最重要的一个类,该类没有公开的构造方法。每一个类在类加载时,JVM都会为该类自动生成一个Class对象,每一个类都仅有一个Cl...原创 2019-03-30 18:21:18 · 158 阅读 · 0 评论 -
泛型
泛型的由来:一般的类或者方法,只能使用具体的类型,要么是基本类型要么是自定义的类,如果要编写可以应用于多种类型的代码,这种刻板的限制对代码的束缚会很大。 ---- 《Java编程思想》在泛型出现之前,多态(方法重载,方法覆写,向上,向下转型)已经算是一种泛化机制,但局限性很大且没有达到人们的需求,因此在JDK1.5...原创 2019-03-17 21:55:32 · 240 阅读 · 0 评论 -
Java学习总结 ---------- 包装类
什么是包装类定义:将基本数据类型封装到类中,即形成包装类。包装类的作用包装类的功能主要是将基本数据类型转化为引用数据类型,以便于操作。使基本数据类型也可以被Object类接收。基本数据类型也可以存放在集合中。包装类中包含每种基本数据类型的相关属性如最大值,最小值等,以及一些操作方法。基本数据类型与之对应的包装类除了char和int的包装类需要单独记忆之外,其它的包装类名称都是...原创 2019-02-01 12:29:50 · 278 阅读 · 0 评论 -
java学习总结------异常处理
异常介绍Java程序员在项目开发中,不可能将代码写得尽善尽美,即使写的尽善尽美也难以避免一些问题,如输入数据类型或者格式不匹配,读取的文件不存在,客户端与服务器通信网络堵塞等,这些问题都是在程序运行期间才会被发现,这些问题统称为异常。异常类的继承结构所有的异常都是由Throwable类继承而来,Throwable下边有两个子类分别是Error和Exception。Error类:描述Ja...原创 2019-01-16 13:02:01 · 312 阅读 · 0 评论