![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 95
w-小菜
I thank you from the bottom of my heart.
展开
-
java多线程---volatile使用&原理
一,Volatile 使用 volatile是使用在成员上的,synchronized是使用在方法上,代码块上面的,其实他们都差不多,对对象进行加索,但是volatile是一个轻量级锁, 他的基本特点:当线程对volatile修饰的变量进行修改,其他线程马上会得知,所以能够保证其他线程获得最新的数据内容。 volatile的作用是强制从公共堆栈中 【读取】 变量的值...原创 2020-04-16 19:10:55 · 277 阅读 · 0 评论 -
java多线程---内存屏障
我们的线程,获得和释放锁,分别执行了两个操作:刷新处理器缓存和冲刷处理器缓存。对于同一个锁所保护的共享数据而言,前一个动作保证了该锁的当前持有线程能够读取到最新数据,后一个动作保证了该锁的当前持有线程能够让更新对后面的线程可见。这两个动作是如何实现的呢?就是今天引入的主题:内存保障 jvm底层借助内存屏障来实现上述两个动作,内存屏障是对一类针对内存读,写操作指令的跨处理器架构的比...原创 2020-04-16 16:21:37 · 336 阅读 · 0 评论 -
java多线程---synchronized的升级优化
如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。 那么synchronized是消耗在哪里呢? 1.线程切换的花费。用户态切换到内核态。 jdk1.6,为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量锁”,在1.6中,锁一共有四中状态,级别从低到高依次是:无锁状态,偏向锁状态,轻量级锁,重量级锁。这几个状态会随着竞争情况逐渐...原创 2020-04-14 19:18:43 · 236 阅读 · 0 评论 -
java多线程---CAS实现原理
一,CAS的使用demo 我们通过一个demo来体会cas的功能是什么:public class MyText{//这里相当于两个integer 数字,一个是原子的,一个是普通的,我们通过++,来比较最后的值。private AtomicInteger atomicI=new AtomicInteger(0);private int ...原创 2020-04-14 16:18:02 · 311 阅读 · 0 评论 -
java多线程---处理器的原子操作
悲观锁:synchronized就是悲观锁,它表示一旦某线程获得锁之后,其他需要锁的线程就挂起等待。 乐观锁:cas操作就是乐观锁,每次不加锁,而是假设没有冲突而去完成某项操作,如果因为冲突失败就重拾,直到成功。 在传统的同步机制中,使用synchronized进行加锁,形成同步代码块,将并行改为串行,从上面分类可以知道,它是悲观的,虽然在1.6之后,进行了锁升级,但是...原创 2020-04-14 16:00:38 · 193 阅读 · 0 评论 -
java多线程---Lock原理AQS
实现原理 synchronized是Jdk底层支持的(jvm指令),而lock是jdk实现,它的实现是通过Java代码的。 我们查看ReentrantLock类,发现这个类里面有三个内部类,正如同下面的关系图,NofairSync是非公平锁,它继续了Sync.同理FairSync也是一样的,重点就放...原创 2020-04-10 17:56:56 · 458 阅读 · 0 评论 -
java多线程---显示锁Lock&Condition的使用
到了这里,就可以理解什么是显式,什么是隐式的,显式就是加锁和释放锁,是用户代码课操控的,而隐式就是一个标记,加索和释锁为jvm来处理。 lock是1.5推出的,并不是取代synchronized的,而是带来了更多的特性,synchronized是在1.6进行升级的。一, 基本使用它为什么推出呢?这里就要涉及到synchronized的缺点 我们直到syn...原创 2020-04-09 22:45:34 · 1600 阅读 · 0 评论 -
java多线程---线程通信(消费者/生产者)
与网络通信不同的是,线程间通信,又称为 进程内通信,而网络通信是进程之间的通信。 线程是一个系统的个体,如果个体不经过特殊的处理,那么就不能整合一起工作,他们必须一起协助,知道一部分其他线程的进度,才能合作完成一个大的工作,那么线程之间的通信就显得尤为重要。! 一,等待/通知机制 1.不使用等待/通知机制实现线程间的通信public class...原创 2020-04-09 21:33:58 · 175 阅读 · 0 评论 -
java多线程---3.synchronized
一,认识java内存模型与多线程。线程处理堆中变量的时候,会先复制一份到自己的私有本地内存中进行操作,所以这里发生了线程不安全的问题。二,锁的概念 锁的产生是:由于线程安全问题的出现,具体什么问题这里就不说了,它的目的就是让并行又变成串行访问(当年我就没搞懂,为了提高效率,我变成并行,为了安全,我又变成串行。。是不是吃饱了撑的,这里不要误解,大体上是并行的,只有涉及到安...原创 2020-04-08 15:45:13 · 177 阅读 · 0 评论 -
java多线程---2.ThreadLocal类
它是什么? 它是一个线程的副本变量工具类,[工具类]java.lang.ThreadLocal.,当各个线程依赖同一个对象的时候,将这个对象复制隔离起来,互不影响的骚操作。也就是说,它应该是一个容器是吧,它不是一个线程! 为什么要这样操作呢?如果说各个线程的操作互不影响,加锁又消耗效率,那么复制一份就是解决办法,由于java是引用类型,所以复制不简单,可能要序列化才能高度,所以这...原创 2020-04-07 11:55:07 · 197 阅读 · 0 评论 -
java多线程---1.Thread类
多线程,是拿来干什么的,我们先从计算机整体开始说起来,计算机的组成cpu+内存+硬盘,就是我们只要的硬件设备,在我看来,计算机除了cpu内部最核心的地方是拿来进行计算出来的,其他都是用来进行存放数据的,当然在组合各系统工作中,还需要很多的转换器,也就是接口,计算机之间要进行通信,那么需要进行联网,这个网络信息发送也是一个大功能,这里虽然是java的一个基础,但是先不讨论。 计算机是...原创 2020-04-07 09:07:54 · 247 阅读 · 0 评论 -
java多线程---线程池
1.基本架构Executors和arrays,collections一样,是一个工具类。,那么底层核心在ThreadPoolExecutor上面。2.实现有5种实现,重点3种:通过executors获得。(同时,第四种获得java多线程的方式,线程池,第三种是通过callable,其余两种thread,runable)1.fixedThreadPool() ,固定装载的线程数量。里面使用了一个LinkedBlockQueue,有最大线程数量,如果来的请求了超过了线程池的最原创 2020-07-29 19:35:36 · 231 阅读 · 0 评论 -
JVM---7.常用调优工具
一,jps全称:java virtual machine process status tool 1.不带参数 默认列出VM表示符号和简单的class或者jar名称 与ps -ef|grep java (查看与java有关的进程信息,linux命令)对比: 对比结果:linux展示的信息中,没用jps进程2.jps -m 输出主函数传入的参数3.jps -l 查看程序所在的包名二, jmap1.jmap -he...原创 2020-12-13 15:48:26 · 281 阅读 · 0 评论 -
JVM---6.方法调用
参考链接: https://www.cnblogs.com/chenyangyao/p/5305352.html(其实是《深入了解java虚拟机》)一,方法调用 方法调用不同于方法的执行,它不涉及代码内容,方法调用阶段的唯一任务就是缺点被调用方法的版本(父类,子类,重载等等),Class文件的编译过程中不包括传统编译器的连接步骤,一切方法调用都在class文件里面存储的符号引用...原创 2020-04-08 14:32:15 · 209 阅读 · 0 评论 -
JVM---5.垃圾回收策略
哪些内存需要回收,什么时候进行回收,如何回收? 为什么要学习垃圾回收,由于内存溢出的问题,当垃圾回收成为系统并发的瓶颈的时候,就需要对垃圾回收进行监控和调节。一,对象已死? 1.引用计数算法:在编译的时候记录这个对象的调用次数,在使用的时候,每一次调用就减去一个数,为0的时候,说明不会调用了,则判断对象死亡。(占用内存空间,看似简单,但是实现起来很复制,如果出现互相循环引...原创 2020-04-05 22:07:46 · 178 阅读 · 0 评论 -
JVM---4.类加载机制
一,类加载的时机 一个类从被加载到虚拟机开始到卸载,要经历七个阶段: 1.记载-2.验证-3.准备-4.解析-5.初始化-6.使用-7.卸载 2-3-4被称为连接 加载在虚拟机规范种没有规定什么时候开始,有虚拟机实现确定,但是规定了初始化在发生下面六情况的时候,一定要马上执行(当然执行初始化,一定要执行前面的加载,验证,准备,解析等过程) ...原创 2020-04-06 14:17:45 · 161 阅读 · 0 评论 -
JVM---3.Class文件结构解析
参考链接: https://blog.csdn.net/IT_GJW/article/details/80447947.java编译后形成.class文件,class文件到底是一种什么样的存在,为什么有它的存在? 如果全世界的pc指令集只有x86一种,操作系统也唯一,那么就不会有java语言的产生,由于各种竞争,才能促进生成,java也是对各种不同平台的虚拟机生成了统一的执行指令。...原创 2020-04-06 14:11:38 · 207 阅读 · 0 评论 -
JVM---2.内存溢出
三,内存溢出异常 1.堆溢出:这个是最容易溢出的,实例化对象,无法获得空间存放。设置jvm的堆空间大小:堆初始化大小20M,最大20M,新生代10M,打印打击回收详细信息,设置新生代中的比例为8:2注意一定要设置-Xmx的堆最大值,不然它会扩大堆的大小,测试代码:public class MyT { static class OOMObject{ } public static void main(String []args) { List<OOMObj..原创 2021-08-25 12:41:20 · 453 阅读 · 0 评论 -
JVM---1.内存区域划分
说明:图片源自尚硅谷公开课课件截图。参考书籍:《深入了解java虚拟机》 c/c++ 与 java的区别就是,java对内存的管理进行了封装,而c++需要自己区分配内存,使用完了之后,还需要自己去释放。java虚拟机自动实现了对内存的管理,很方便,但是!虽然方便了,但是设置是默认的,每个应用不一样,如果内存不够用就会出现问题,那么作为程序员,就不得不去了解jvm的内存是如何运作的,在出...原创 2020-03-29 19:20:05 · 289 阅读 · 0 评论 -
集合---阻塞队列
java中的BlockingQueue接口是一个线程安全的存取队列,它提供四种不同的处理方法阻塞队列定义:队列插入的时候,当队列满时,队列会阻塞插入元素的线程,直到队列不满。 队列元素移除的时候,如果队列是空的,那么会等待队列有元素的时候,再移除。上面四种情况,是面对队列满的时候,为空的时候,处理方案,不同场景使用不同的方案。jdk7提供的7个阻塞队列:1.ArrayBlokingQueue:底层是数组,有界2.LinkedBlockingQu...原创 2020-07-29 19:21:59 · 176 阅读 · 0 评论 -
集合---非阻塞队列
队列概念 Queue接口与List、Set为同级别,都为Collection接口子接口。除了拥有 Collection 接口基本操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。非阻塞队列:ConcurrentLinkedQueue 传统的Queue在面对多线程情...原创 2020-07-29 16:10:23 · 166 阅读 · 0 评论 -
集合---ConcurrentHashMap
ConcurrentHashMap 继承于AbstractMap,实现了Map,Serializable接口。它实现了线程安全,比hashtable效率高很多,它允许多个修改操作并发运行,其关键使用了“锁分离”技术,即代码块锁,而不是方法锁,它使用了多个锁来控制对hash表的不同部分进行的修改。Jdk7和jdk8有很大改动,我们先看Jdk7版本Jdk7最开始我们的hashMap把所有数据都存放到table中,而现在,我们对table进行了切分,分成了很多段,形成了两层数组来保存,所以C...原创 2020-07-29 14:48:36 · 164 阅读 · 0 评论 -
集合---HashMap的不安全
1.hashMap存在的问题public static void main(String[] args) throws InterruptedException { Map<Integer,Integer> map=new HashMap<>(); Thread t1 = new Thread() { public void run() { for (int i = 0; i < 50000; i++) {原创 2020-07-29 10:21:55 · 165 阅读 · 0 评论 -
集合---HashMap
HashMap1.常量字段介绍static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 2的四次方,初始化默认的容量static final int MAXIMUM_CAPACITY = 1 << 30; 最大的容量值static final float DEFAULT_LOAD_FACTOR = 0.75f; //容量 负...原创 2020-09-20 11:31:44 · 133 阅读 · 0 评论 -
集合---Map
1.常量字段介绍static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 2的四次方,初始化默认的容量static final int MAXIMUM_CAPACITY = 1 << 30; 最大的容量值static final float DEFAULT_LOAD_FACTOR = 0.75f; //容量 负载因子,static final int TREEIFY_THRESHOLD = 8;原创 2020-07-27 22:43:59 · 123 阅读 · 0 评论 -
集合---Set
1.字段属性private transient HashMap<E,Object> map;private static final Object PRESENT = new Object();HashSet集合中的内容是通过HashMap数据结构来实现的,它的内容作为key保存,value统一为PRESENT。2.构造方法无参构造方法,使用hashMap的默认参数public HashSet() { map = new HashMap<>();..原创 2020-07-28 15:23:33 · 124 阅读 · 0 评论 -
集合---List
List下面最常用的实现类ArrayList,底层使用数组存放内容,重要掌握如何初始化空间,如何扩容等等。1.字段private static final int DEFAULT_CAPACITY = 10; //默认初始化大小 10private static final Object[] EMPTY_ELEMENTDATA = {}; //这两个字段是用来区分构造方式的,是默认构造还是固定了参数private static final Object[] DEFAULTCAP...原创 2020-07-25 18:43:08 · 120 阅读 · 0 评论 -
java---编码方式
1.unicode和utf-8有什么区别: 前者是字符集,也就是一个符号对应一个编号(相当于一个字典),ascill采用的是一个字节来存放英文+符号,但是我们中文数量太多了,无法用一个字节存放,所以采用unicode编码,两个字节来存。I 00000000 01001001t 00000000 01110100' 00000000 00100111s 00000000 01110011 00000000 00100000知 01110111 11100101乎 01...原创 2020-05-09 21:11:45 · 1432 阅读 · 0 评论 -
数据库连接池-浅析
java web应用的基础就是 连接数据库,对数据进行crud。 那么java是如何连接 数据库的呢?那就是jdbc。使用jdbc就可以连接上我们想要的数据库。jdbc 是什么呢? 全称:Java DataBase Connection用java 连接关系数据库的api,是一种接口规范,它位于java.sql包和javax.sql包里,而具体实现是各大数据库厂商,根据...原创 2020-03-12 23:31:11 · 173 阅读 · 0 评论 -
java 字节流实现目录的复制
package tu;import java.io.*;public class sss { public static void aa(File fr,File fw) throws IOException { //源目录目录提取; File [] a=fr.listFiles(); for(File b:a) { System.out.println(b.getName()); ...原创 2018-07-02 21:15:57 · 313 阅读 · 0 评论