自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 问答 (1)
  • 收藏
  • 关注

原创 Java锁源码分析-ReentrantReadWriteLock(可重入的读写锁)

Java锁源码分析-ReentrantReadWriteLock(可重入的读写锁)使用场景基本用法KaTeX数学公式本文分析了可重入的读写锁的使用场景,基本用法,源码解析。使用场景首先了解下读锁与写锁的互斥性:读锁-读锁 不互斥读锁-写锁 互斥写锁-写锁 互斥也就是说在多个线程都加读锁,不存在写锁的情况下,多个线程可以并发执行下去。这样,就解决了传统上的直接加互斥锁,导致不管是读-读,还是读-写都要等待持有锁的线程释放锁。使用读写锁在合适的场景下(一般是读的次数远高于写的次数)就可以提高并

2021-03-05 11:28:21 221 2

转载 JDK常用的命令行工具

JDK常用命令行工具(基于JDK10)原文链接:JDK常用命令行工具(基于JDK10)虽然我是在jdk10环境下, 但是大体上和jdk8是差不多的. 总共有这么多本来想着一口气把所有命令都边学边总结一下的, 结果发现....有些还真的不是很常用....或者说我这个水平还接触不到那么多.  于是我就把我能使用到的几个常用的总结一下了.  当做是笔记了.jshelljs...

2018-12-22 17:16:59 375

原创 读《深入理解Java虚拟机》-垃圾收集器

垃圾收集器Serial收集器ParNew收集器Parallel Scavange收集器Serial Old收集器Parallel Old收集器CMS收集器G1收集器Serial收集器这是一个单线程收集器,在垃圾收集的时候会暂停其他的工作线程,美其名曰:Stop The World。停止其他线程的动作是jvm自动发起的,在用户不知道的情况下中断用户的工作线程。优点是简单而高效 因为他是单线程...

2018-12-20 19:50:33 193

原创 Java NIO源码解析与应用

本文总结从三个方面由浅入深的讲述Java NIO,channel,buffer,selector(网络NIO)。这篇总结文章也有所参考,特别是NIO入门-IBM,讲的挺好的。NIO处理数据是以数据块为单位,而传统IO流是以字节为单位。显而易见,数据块的操作效率明显更高。Channel:Channel是一个对象,我们对数据的读写都不会直接与Channel接触,而是通过中间的缓冲区buff...

2018-09-26 00:34:00 3802

原创 Java JUC包源码分析 - 多阶段任务Phaser

Phaser是jdk1.7才出现的,可以实现分阶段实现任务,多个线程执行第一个阶段任务,等待所有线程第一阶段执行完了才开始执行第二阶段,如此类推。其实就是多个栅栏CyclicBarrier,只不过这个Phaser比较灵活。先看下用法: 上个例子写的不够贴切,再深入理解一下再写。。。。。。。package com.pzx.test.test002;import java.text.Si...

2018-09-21 23:02:29 350

原创 Java JUC包源码分析 - 线程池ThreadPoolExecutor

线程池的相关类结构 线程池就是存储了已创建指定个数的线程的集合,当需要用线程执行任务的时候,就可以从线程池中拿一个空闲的线程来执行任务。先看下源码,源码分析完了再看线程池的周边应用,以及几个思考。第一部分,先看下线程池的结构,然后是如何创建线程池。第二部分,线程池的状态第三部分,提交任务到线程池的方法第四部分,关闭线程池第五部分,拒绝策略 第一部分:pub...

2018-09-18 00:20:06 229

原创 Java JUC包源码分析 - ConcurrentLinkedQueue

ConcurrentLinkedQueue不同于LinkedBlockingQueue,它没有利用ReentranLock以及Condition条件。而是利用死循环+CAS来实现线程安全,也就是一个重试的机制。ConcurrentLinkedQueue是一个无阻塞的高效的队列。ConcurrentLinkedQueue是基于单向链表的。public class ConcurrentL...

2018-09-16 23:52:54 157

原创 Java JUC包源码分析 - LinkedBlockingDueue

LinkedBlockingDueue是基于一个双向的链表,可以先进先出(队列),也可以先进后出 (栈)不允许插入null,基本原理和方法都和LinkedBlockingQueue差不多public class LinkedBlockingDeque<E> extends AbstractQueue<E> implements BlockingDe...

2018-09-16 22:47:28 320

原创 Java JUC包源码分析 - LinkedBlockingQueue

LinkedBlockingQueue是一个单向链表的阻塞队列,头部和尾部分别有一个可重入锁控制写入和读取,并且两个锁还各自带了一个condition条件。这样可以增加并发度。这也可以看作是一个可用在队列两端同时操作的队列put()和take()方法都是当遇到满了或空了条件会阻塞的方法offer()和poll()方法都是当遇到满了或空了直接返回false;或者是传入一个等到时间的参数。...

2018-09-16 14:31:16 162

原创 Java JUC包源码分析 - ArrayBlockingQueue

ArrayBlockingQueue是线程安全的阻塞队列,底层是基于数组实现的,既然是数组,那肯定是有界的。保证线程安全是通过可重入锁ReentrantLock实现,且可以控制是公平锁还是非公平锁另外,还提供了Condition条件还控制队列的空和满。当插入一个元素进去,发现队列满了,就会调用notFull.await(),取走一个元素的时候,就会调用notFull.signal()唤醒插...

2018-09-15 12:08:17 120

原创 Java JUC包源码分析 - ConcurrentHashMap

ConcurrentHashMap之较于HashMap是保证了线程安全,其实现方式之精妙有很多值得学习的地方。同时,这篇文章也将持续更新,毕竟目前只研究了常用的几个操作,还有其他操作,等待我去深挖。ConcurrentHashMap主要是依靠了CAS无锁算法和对操作的数组索引处的头节点加锁。扩容操作是可以多线程协助进行,线程只要检测到在扩容就放下当前工作去协助扩容,扩容的优先级还挺高!毕竟...

2018-09-14 22:48:03 199

原创 读《深入理解Java虚拟机》- 类加载过程与类加载器

类加载过程:加载---验证---准备---解析---初始化虚拟机规范规定只有以下5种情况会初始化类:1、遇到new getstatic putstatic invokestatic这四条字节码指令时,如果类没有进行过初始化就初始化类new:就是普通的new一个类的时候getstatic:就是读取一个类的静态变量时(被final修饰、已经在编译器把结果放入常量的静态变量除外)putst...

2018-09-13 18:13:54 106

原创 Java JUC包源码分析 - CopyOnWriteArrayList和CopyOnWriteArraySet

CopyOnWriteArrayList可以看作是线程安全的ArrayList,底层数据结构是数组。主要实现过程就像它的名字,在写(增、删、改)的时候,先copy出一份副本,然后对副本操作,最后把副本赋值给原来的数组,整个过程是在ReentrantLock的lock下完成。这么做的目的其实就是为了在保证线程安全的情况下,不阻塞读。存储数据的是用volatile修饰的数组,能够保证多线程场景...

2018-09-12 19:35:47 178

原创 Java JUC包源码分析 - 信号量Semaphore

信号量是基于共享锁和许可的原理实现,在初始时给定许可数,获取时如果当前许可足够,就获得许可往下执行,否则就阻塞。信号量还分公平信号量和非公平信号量,两者的区别就在于再尝试获取许可的时候,公平信号量还需要判断当前线程所在的节点是不是CLH队列的头节点,其他都一样。释放锁的过程两者也是一样的。先看下用法:package com.pzx.test.test00001;import ja...

2018-09-11 23:21:31 355

原创 Java JUC包源码分析 - 栅栏CyclicBarrier

栅栏不同于倒计时器的一点是倒计时器是一个或N个线程等待其他线程调用countdown()到指定次数后再继续执行,而栅栏是N个线程之间互相等待,当调用await()到达指定次数后就会唤醒所有等待线程,同时还可以在到达指定数量时触发一个定制的动作(Runnable,由最后一个调用await()方法并唤醒所有线程的那个线程执行)。另外栅栏是可以循环使用的。栅栏的实现方式是独占锁+Condition条...

2018-09-11 19:33:10 475

原创 Java JUC包源码分析 - 倒计时器CountDownLatch

倒计时器CountDownLatch是让一个或多个线程等待其他的线程执行完后再开始继续执行,是基于共享锁实现的。话不多说,先看下怎么使用,下面是自己写的一个Demopackage com.pzx.test004;import java.text.SimpleDateFormat;import java.util.Date;import java.util.concurrent.C...

2018-09-11 11:34:38 216

原创 Java锁源码分析-ReentrantLock和AQS

ReentrantLock与synchronized都是可重入锁,都是独占锁。可重入锁的意思就是在一个已获得锁的线程中,可以再次获得同一把锁。区别在于:1、ReentrantLock可以设置锁等待的超时时间(避免一致等待下去)2、ReentrantLock可以实现公平锁与非公平锁(阻塞线程是否按照先来先获得锁的顺序)3、ReentrantLock可以设置条件(Condition...

2018-09-07 00:11:47 213

原创 Java多线程-线程基本方法

上面是线程状态的转换图yield:yield使得当前线程的运行状态由 运行状态转为就绪状态在当前线程获得锁的情况下,不释放锁Object的wait()是使得当前线程的运行状态由 运行状态转为阻塞状态在当前线程获得锁的情况下,wait释放锁sleep();使得当前线程休眠指定时间(大于等于?)在当前线程获得锁的情况下,不释放锁join();让主线程等待子线程执行完毕再执行...

2018-09-04 00:13:56 126

原创 Java多线程-线程基础

线程的两种实现方式:继承Thread(Thread类也实现了Runnable接口)实现Runnable接口synchronized:只要synchronied()是同一把锁,那么多线程访问的时候就会阻塞注意:对象锁和类锁是属于不同的锁,所以可以同时访问类锁:  private static synchronized void b() {}对象锁:private synchroni...

2018-09-04 00:00:48 100

原创 Java源码分析-WeakHashMap

WeakHashMap里面的键是弱键,也就是和弱引用相关的。如果put到WeakHashMap里面的键值被垃圾回收了,此键值就会放到WeakHashMap的ReferenceQueue中,那么在下次操作WeakHashMap时候,会去拿ReferenceQueue里面的元素和Map里存的key比较,如果相同,就把Map对应的元素删除(因为被垃圾回收也就是没有任何引用到它的对象了)publ...

2018-09-03 23:41:39 140

原创 Java源码分析-LinkedHashMap

LinkedHashMap基于链表的HashMap,继承自HashMap,所以HashMap有的功能它都有。LinkedHashMap保存了元素的插入顺序,可以按照插入顺序遍历,也可以看作是FIFO访问顺序的实现。同时,也可以设置保存访问顺序,按照最近最少访问的顺序保存元素, 也可以看作是LRU的实现。下文有实现LRU的方式removeEldestEntry()默认实现是返回false...

2018-09-03 23:20:40 90

原创 Java源码分析-TreeMap

TreeMap是实现了排序功能的Map,如果不传入比较器,则按照key的自然顺序排序。它的数据结构是完全基于红黑树 public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializabl...

2018-09-03 23:00:36 106

原创 Java源码分析-原子操作类Atomic

原子操作类主要有:AtomicLong                       AtomicInteger                       AtomicReference                          AtomicBooleanAtomicLongArray              AtomicIntegerArray               At...

2018-09-02 15:12:56 298 2

原创 Java源码学习-HashMap(JDK8)

前一篇总结了JDK5和7的HashMap的源码实现,这一篇来看下JDK8中HashMap的进步之处。首先看HashMap的成员变量: // 默认初始化大小:16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 // 最大容量:2^30 static final int ...

2018-08-27 23:49:50 100

原创 读《深入理解Java虚拟机》- Java对象创建过程

本文较为浅显的说明一下new一个Java对象的过程是怎么样的,对象头到底存了啥,已经对象的访问定位方式。里面会涉及到其他知识,等总结后再把链接贴上来。Object obj = new Object();1、虚拟机检测到new关键字时,先检查这个new的参数(也就是类名)在常量池中有没有一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析、初始化过了,如果没有,需要先执行类的加...

2018-08-26 16:11:58 130

原创 读《深入理解Java虚拟机》- Java内存区域

Java的运行时数据区被划分为5给部分,分别是:程序计数器java虚拟机栈本地方法栈Java堆方法区前面三个是线程私有的,后面两个是线程共享的。1、程序计数器程序计数器是一块很小的空间,Java虚拟机规范没有规定此内存会产生OOM。它是当前线程执行到哪里的行号指示器,可以理解为是当前线程执行的字节码的地址。字节码解释器在工作时就是通过改变这个计数器来选取下一...

2018-08-26 10:49:49 127

原创 读Effective Java - 001条 考虑用静态工厂方法代替构造器

(写篇文章不容易啊,在公司看完书,写完笔记,然后复制回来再发布。。。)静态工厂创建对象的时候有三大好处1. 静态工厂方法有名称,能够更加容易的使用(明确功能),代码的可读性更强。 //构造函数 BigInteger b = BigInteger(int bitLength, int certainty, Random rnd) //静态工厂 BigInteger b = BigI...

2018-08-22 20:55:27 148

原创 Java源码学习-HashMap(JDK5与JDK7)

目录首先,来看一下jdk5的经典实现吧。然后,开始瞅一瞅JDK7的HashMap实现吧最后,对HashMap的两个思考为什么容量大小一定是2的幂次方?第二个问题就是重写equals方法必须重写hashcode方法在HashMap这得到印证。首先,来看一下jdk5的经典实现吧。1、HashMap继承了AbstractMap,实现了三个接口:Map,Cloneable,Se...

2018-08-21 00:07:42 917

原创 Struts2实现文件下载

Struts2实现文件下载

2016-06-06 00:46:10 255

原创 Struts2实现文件批量上传

Struts2实现文件批量上传

2016-06-06 00:38:43 848

原创 编译原理-词法分析器

编译原理课程之词法分析器

2016-05-31 22:33:56 726

转载 CentOS下Mysql数据库的安装与配置以及遇到的问题及其解决方案

CentOS下Mysql数据库的安装与配置

2016-05-31 12:43:46 1680

原创 linux用户切换命令

su -[输入root密码]注:因为root是linux默认的用户,所以不需要用户名从root切换到普通用户不需要输入密码直接敲命令:su [用户名]

2016-05-31 10:03:09 421

转载 linux常用命令

本文并不会对所有命令进行详细讲解,只给出常见用法和解释。具体用法可以使用--help查看帮助或者直接通过google搜索学习。1.查找文件find / -name filename.txt 根据名称查找/目录下的filename.txt文件。find . -name "*.xml" 递归查找所有的xml文件find .  -name "*.xml" |xargs grep  "he...

2016-05-30 21:34:02 469

原创 java基本语法之基本数据类型详解

java基本语法之基本数据类型详解、数据类型之间的转换、基本数据类型之间的转换规则、包装数据类型与基本数据类型之间的转换、转换实例

2016-05-30 19:41:47 1073

空空如也

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

TA关注的人

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