![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
随风而醒
我是个疯子,虽然我在服新药,但仍旧有幻觉
展开
-
JDK8源码分析之-concurrenthashmap
ConcurrentHashMap主要的核心设计有:* 数据结构方面:相对于1.7,采用了单元素segment,采用了链表+红黑树德存储结构* 并发安全方面:读取时采用CAS乐观锁,读取时采用Synchronized悲观锁。从两个函数看源码:添加函数:putVal/** * @param key * @param value * @param onlyIfA...原创 2019-04-27 16:04:53 · 1068 阅读 · 0 评论 -
并发编程实战3-单例模式与线程安全性问题
单例模式是为了保证一个应用中只有一个实例对象,在单线程的情况下,只需对构造方法私有化,加上对象唯一指定就能实现,但是在多线程的情况下,就会出现问题指令重排序: 大多数现代微处理器都会采用将指令乱序执行(out-of-order execution,简称OoOE或OOE)的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待3。通过乱...原创 2018-04-09 21:13:48 · 327 阅读 · 0 评论 -
并发编程实战2-Synchronized原理与使用
Synchronized分类:修饰实例方法、静态方法和代码块1、放在普通类方法上,内置锁就是实例对象2、修饰静态方法,内置锁为当前的class字节码对象Sequence.class3、修饰代码块,内置锁为括号里的对象锁分类:偏向锁、轻量级锁和重量级锁 Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mute...原创 2018-04-08 22:41:01 · 172 阅读 · 0 评论 -
并发编程实战1-多线程的周期、实现方式和意义
day01:线程的周期day02:创建线程的多种方式(7中):一般推荐采用Runnable接口或者Callable接口来实现多线程。西红丝鸡蛋汤:继承Thread类主线成为最简单的汤的做法,现在需要仿照这个做法,定做自己的直接继承,可以使用一些父线程的共同属性实现Runnable接口做汤的方法都知道,但是需要自己安排还可以继承其他类,可拓展性比较好由于接口内部...原创 2018-04-08 21:35:08 · 195 阅读 · 0 评论 -
Java NIO:Buffer、Channel 和 Selector
原文出处: JavaDoop本文将介绍 Java NIO 中三大组件 Buffer、Channel、Selector 的使用。本来要一起介绍非阻塞 IO 和 JDK7 的异步 IO 的,不过因为之前的文章真的太长了,有点影响读者阅读,所以这里将它们放到另一篇文章中进行介绍。Buffer一个 Buffer 本质上是内存中的...转载 2018-03-05 10:10:14 · 193 阅读 · 0 评论 -
深入理解Java虚拟机-3垃圾收集器与内存分配策略
本章将是jvm相关面试的核心内容之一,而之所以将jvm作为java面试的重点,正是在于相对于C++而言的。因为jvm的存在,导致java存在了很多的优点,如跨平台、开发者不需要过多的关注内存变化等,因为这些正是jvm帮助我们做的,而对于C++而言,比如回收内存都是需要开发者亲自来操作的,并且其中很多的错误都是由此导致的。 还记得本科大二的时候(2014年),当时正在为找工作准备方向,当时是的原创 2018-01-26 22:55:39 · 227 阅读 · 0 评论 -
看透SpringMVC源码-网站架构演变1-3
第1章、网站架构及其演变过程1.1. 软件三大类型单机版(不需要联网)CS版(客户端-服务器)BS版(浏览器-服务器)1.2. 网络结构OIS参考模型一共分为7层,这个主要用于教学。实际使用为4层: * 网络接入层-将节点接入目标 * 网络互联层-寻找连接目标 * 传输层-实际传输数据 * 应用层-使用接收到的数据1.3. 原始网站架构浏览器 –> 服务器原创 2018-01-20 11:41:26 · 308 阅读 · 0 评论 -
看透SpringMVC源码-Socket和Servlet详解3-6
第4章 Java中socket的用法 Java中的socket有两种:普通Socket和NioSocket4.1 普通socket的用法 socket主要用来进行网络通信,即服务器和客户端通信,由于服务器和客户端的不同所以相应的也有一点区别。socket相当于通信的载体。socket有两种:ServerSocket和Socket,Socket主要用于服务器和客户端通信;Server原创 2018-01-23 16:31:49 · 384 阅读 · 0 评论 -
Java学习笔记-反射及其应用
转载链接:https://www.zhihu.com/question/66525147/answer/243752511 来源:知乎Java的反射特性一般结合注解和配置文件(如:XML)来使用,这也是大部分框架(Spring等)支持两种配置方式的原因。如果是注解方式:当服务端启动时,Spring框架会去扫描指定目录下的类,通过反射看类有没有Service注解,如果类上有 Service注解,会提转载 2017-10-15 16:24:43 · 379 阅读 · 0 评论 -
深入理解Java虚拟机-8虚拟机字节码执行引擎
参考:https://zhuanlan.zhihu.com/p/28468115 http://www.cnblogs.com/deman/p/5489895.html 8.1. * 概述:相对于物理机而言,Java虚拟机相当于一座架设在开发人员与物理机之间的“桥梁”。一端接受的是开发人员的字节码文件,另一端将字节码转化为物理机能够执行的机器码。这样,只要有java虚拟机存在的地方就可以使用虚原创 2017-10-19 15:15:45 · 346 阅读 · 0 评论 -
JAVA中的内联函数
在说内联函数之前,先说说函数的调用过程。 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保 存地址继续执行。也就是通常说的压栈和出栈。因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体 代码不是很大,又频繁调用的函数转载 2017-06-19 13:10:40 · 1192 阅读 · 0 评论 -
java面试准备-day01
一、Java:按值传递还是按引用传递详细解说java只有值传递基本类型,直接按值进行传递,所传的值为原值的副本,不改变;引用类型指向一个实例对象,p->persion,所传的值也是p的副本(-p),当改变-p指向的对象时,对象本身即发生改变。p指向并没有被影响到。这两个其实是一个意思,说多了反而复杂了。至于String对象, 有一个很好地解释: String传递的也是引用副本的传递,但是因原创 2016-08-10 17:40:34 · 733 阅读 · 0 评论 -
java面试准备-day02
十四、线程组的作用线程组的作用相当于将一组线程封装到一个组里面,这样就保证了这些线程是一个整体;相反,如果不封装,这些线程就属于单独的个体,就会和其他线程(不再这个组的)同步执行。(作用是,整体线程组全部都完成后,才能执行其他的线程)问题的提出,我们经常会有几项的任务,这几项任务之间本身没有先后顺序关系,或者是协作来共同完成一个目标。这个时候,我们就希望能够把这几项任务并行进行运行以充分利用CP原创 2016-08-12 15:54:07 · 757 阅读 · 0 评论 -
并发编程实战4-自旋锁,死锁,以及锁重入详解
锁重入:也叫做递归锁 某个线程获得一个已经由它自己持有的锁对象,那么这个请求就会成功,即重入重入是对本线程来说,即本线程多资源可以多次加锁进入,而不会出现阻塞在JAVA环境下 ReentrantLock 和synchronized 都是可重入锁场景:比如数据库中,用户名和密码保存在本地txt文件中,则登录验证方法和更新密码方法都应该被加synchronized,那么当更新密码的时候需要验...原创 2018-04-09 21:14:32 · 723 阅读 · 0 评论 -
Java中的读写锁
并发安全问题主要是出现在写的情况下,而读取数据并不影响数据的结果;另外,大高并发的情况下,大多数都是数据的读取,写操作是很少的,所以可以将数据的读写进行分离,将大大提高运行效率。读写锁又叫做共享锁和排它锁,即读取是线程共享的:可以多个线程一起读取,但是不能被写;写入是排他性的,只能有一个线程进行操作:既不能被读取,也不能被其他线程写入。三种:读读不互斥,读写互斥,写写互斥。 ...转载 2018-04-10 11:44:08 · 209 阅读 · 0 评论 -
并发编程实战6-线程之间的通信-深入解析Condition源码
Object类的几个方法notify方法:只会随机唤醒一个wait线程,然后此wait线程将会继续执行 notifyAll方法:会唤醒所有的wait线程,所有wait线程将会全部执行显示锁的condition对象对于Object类的wait和notify方法有一定的缺陷,即无法精确唤醒指定的线程。所以引入了lock的condition对象,可以对不同的条件进行判断,来选择唤醒不同的线...原创 2018-04-10 11:46:09 · 170 阅读 · 0 评论 -
《深入理解Java虚拟机》读书笔记
世间万物皆系于四剑之上尽管这本书是一本讲述Java的书籍,但是这本书的内容却并不只是针对Java而言。而是针对计算机整个底层的规划,如何通过底层的设计来创造出合理便捷的语言。底层开发人员需要了解上层的应用而设计合理的底层结构,上层开发人员需要连接底层的结构来更好的理解程序的内部逻辑。程序的运行流程:编写好的Java文件,首先通过编译器编译为class字节码文件,在这个过程中,虚拟机会对...原创 2019-04-12 12:47:33 · 991 阅读 · 0 评论 -
《Java并发编程的艺术》读书笔记
君子谋道不谋食,恍惚半载被忧贫第一章:并发编程的问题多线程是为了解决效率问题,尽可能使用处理器资源,同时保持线程共享资源安全。2. 1. 上下文切换:多个线程之间,频繁的切换,浪费调度资源2. 死锁:由于死循环或者互斥等造成的线程无法继续进行,永久等待的情况3. 资源限制的挑战:读入速度大于写入速度第二章:java并发机制的底层实现和主要工具轻量锁:volatile-单词的意思...原创 2019-04-07 17:54:42 · 958 阅读 · 0 评论 -
微信公众号平台搭建连接javaweb
先决条件:一个本地可运行的javaweb:我的是一个网上git的springboot项目 注册一个微信公众号申请链接配置前的准备-内网穿透 由于项目搭建在本地电脑上,外网无法访问,所以需要使用工具将本地地址映射到公网。免费工具使用:natapp natapp下载网址 natapp配置教程 注意:这里只能使用80端口,因为微信公众号只开放80端口使用免...原创 2018-05-03 12:12:25 · 3340 阅读 · 0 评论 -
并发编程实战15-重排序、happens-before
指令重排序 为了优化CPU的运行效率,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待3。通过乱序执行的技术,处理器可以大大提高执行效率。 比如:对于如下代码int a = 10 // 1 int b = 100 // 2int c = a // 3实际的执行过程可能会是:1-3-2,而不是:1-2-3;因为第一步获取a的值后...原创 2018-04-17 16:12:28 · 183 阅读 · 0 评论 -
并发编程实战14-LongAdder统计加法器-计数器jdk8
传统的原子锁AtomicLong/AtomicInt虽然也可以处理大量并发情况下的计数器,但是由于使用了自旋等待,当存在大量竞争时,会存在大量自旋等待,而导致CPU浪费,而有效计算很少,降低了计算效率。而LongAdder是根据ConcurrentHashMap这类为并发设计的类的基本原理——锁分段,通过维护一个计数数组cells来保存多个计数副本,每个线程只对自己的副本进行操作,最后汇总来得...原创 2018-04-17 11:46:56 · 928 阅读 · 0 评论 -
并发编程实战13-同步中的四种锁synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock
synchronized同步锁 synchronized属于悲观锁,直接对区域或者对象加锁,性能稳定,可以使用大部分场景。ReentrantLock可重入锁(Lock接口) 相对于synchronized更加灵活,可以控制加锁和放锁的位置可以使用Condition来操作线程,进行线程之间的通信核心类AbstractQueuedSynchronizer,通过构造一个基于阻塞的CLH队列容...原创 2018-04-17 09:58:58 · 667 阅读 · 0 评论 -
并发编程实战11-并发容器CopyOnWriteArrayList
一、同步容器和并发容器 在jdk早期,为了解决并发安全问题,引入了同步容器Vector和Hashtable。在JDK1.2中,引入了同步封装类,可以由Collections.synchronizedXxxx等方法创建,可以直接对ArrayList进行封装以达到同步。但是,同步容器有一个问题,过于严格,即完全串行执行,导致即便是在复合操作下,并没有线程安全问题,也会加锁。 常见复合操作如下:...原创 2018-04-11 15:37:52 · 293 阅读 · 0 评论 -
并发编程实战10-多线程中的任务分解机制ForkJoinPool详解
Fork/Join 模式类似于MapReduce,也相当于一种分而治之的理念,或者说就像二分查找、二路归并算法。通过将一个大量的计算分解为许多的小计算,分而治之,然后再合并,同时,这些分出来的每个小计算都是并行进行的,这样就大大增大了CPU的利用率。Fork/Join 模式有自己的适用范围。如果一个应用能被分解成多个子任务,并且组合多个子任务的结果就能够获得最终的答案,那么这个应用就适...原创 2018-04-10 22:35:07 · 865 阅读 · 0 评论 -
并发编程实战9-Java中的并发工具类
在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数据的一种手段。一、等待多线程完成的CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。 比如我们现在需要一个计算c=a+b总和的任...原创 2018-04-10 22:34:28 · 226 阅读 · 0 评论 -
并发编程实战8-ThreadLocal原理与使用-线程局部变量
首先,我的理解,ThreadLocal只是一个公用对象,但是并不是完全用来作为线程之间共享的。原因在于,它只是一种公用变量模板,每个线程只是拥有它的复制版(线程死亡后,复制版也随之死亡),而不是直接使用公用变量,这样就避免了共享安全问题。但是,为什么不让每个线程直接去创建自己的实例变量呢?主要是因为,线程进来时它自己可能并不清楚需要哪些变量,而且在线程执行完毕,还需要自己去销毁这些变量,这样...原创 2018-04-10 17:38:29 · 300 阅读 · 0 评论 -
并发编程实战7-线程之间的通信2-join加塞线程
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。 t.join(1000); //等待 t 线程,等待时间是1000毫秒一、为什么要用join()方法: 在很多情况下,主线...原创 2018-04-10 11:46:42 · 256 阅读 · 0 评论 -
java面试准备-day03
二十一、 (x&y) + ( (x^y)>>1 )=(x+y)/2证明关于二进制的所有证明,今天得到了很好的理解。对于任何一个数,首先,我们要把所有的数想成1和0之间的运算,而不是11110000和10100101之间的运算,这样才能找到规律(可能不适用于其他的运算,暂时未发现)。java中的二进制运算包括与&、或|、非~、异或^四种,以及几种位移运算;这里我们把所有的整数数都拆开来看:m=a0原创 2016-08-12 18:09:46 · 577 阅读 · 0 评论 -
java面试准备-day03-并发包类
1.ConcurrentHashMapConcurrentHashMap其实就是线程安全版本的hashMap。简单的解释就是通过把整个Map分为N个Segment(类似HashTable),这样每个HashTable之间就线程就不会发生冲突,可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。 深度剖析ConcurrentHashMap ConcurrentHashMap原理分析2.C原创 2016-08-13 12:31:56 · 2706 阅读 · 0 评论 -
java学习笔记-多线程
基础知识:操作系统将CPU的时间片分配给每一个线程使用,给人一种并行处理的感觉。多进程和多线程的区别:每个进程都有自己的一整套不变量(独立代码和数据空间),进程切换开销大含多个线程;而线程共享数据,每一个线程都有自己独立的运行栈和程序计数器,线程切换开销小多线程是为了提高CPU的利用率。--》在java中,每次运行一个程序都会启动两个线程:一个是main线程,一个是JVM垃圾收集器原创 2016-03-14 16:41:03 · 615 阅读 · 0 评论 -
java学习笔记-集合
集合类的基本接口是collection接口(集合中不予许有重复的对象)和Map接口:(设计模式:接口隔离原则)---》这个接口的两个基本方法是:add();Iterator():实现了Iterator接口,next()方法和hasnext()方法需要联合使用; 这里的两个方法其实是和enumeration接口的nextElement和hasMoreElement方法一致原创 2016-03-13 22:49:17 · 715 阅读 · 0 评论 -
Java面试常考知识点
1》什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? ------------Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其原创 2016-03-07 16:32:58 · 1403 阅读 · 0 评论 -
HashMap、LinkedHashMap、Hashtable和TreeMap用法和区别
Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap、HashTable、LinkedHashMap和TreeMap。本节实例主要介绍这4中实例的用法和区别。一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要原创 2016-03-07 10:04:02 · 778 阅读 · 0 评论 -
Java学习笔记-笔试考点
java笔记1》,java关键字必须以$ _ 字母开头2》,is-a是指类之间的继承关系;has-a是指对象和成员之间的从属关系(类中必须定义成员)3》,静态方法静态代码块public class Static {static{int x=5;}static int x,y;public static void main(String[] a原创 2016-03-30 11:46:51 · 1012 阅读 · 0 评论 -
Java的native方法
第一篇:一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一机制,比如在C++中,你可以用extern "C"告知C++编译器去调用一个C的函数。转载 2016-03-06 11:08:59 · 756 阅读 · 0 评论 -
Java异常
** 1.JAVA异常**![JAVA异常](http://img.blog.csdn.net/20160306103546259)Throwable是所有异常的根,java.lang.ThrowableError是错误,java.lang.ErrorException是异常,java.lang.Exception在 Java 中,所有的异常都有一个共同的祖先 Th原创 2016-03-06 10:43:57 · 477 阅读 · 0 评论 -
List和ArrayList的区别
List和ArrayList的区别: -----------------List是一个接口,而ListArray是一个类。 ListArray继承并实现了List。 所以List不能被构造,但可以向上面那样为List创建一个引用,而ListArray就可以被构造。 List list; //正确 list=null; List list=new List(); //...原创 2016-03-06 00:19:41 · 513 阅读 · 0 评论 -
第一次面试
第一经历面试(电话面试),惨不忍睹。各种问题都答不出来,突然发现自己什么都不会,貌似学了很多,很多都懂,但真正让你去描述时,什么都忘记了,什么都不会了, 本来表达能力就不强,一下次全都暴露出来了,所以,开始写一个面经—-面试经历:来记录自此以后都没一个面试,每一个细节,以便以后从中了解自己缺点,更好的提高自己. ———-面试开始,直接是自我介绍,虽然看过无数自我介绍的要点指导,但真正再来一遍的时原创 2016-03-05 23:40:17 · 736 阅读 · 0 评论 -
Java学习笔记-泛型
一、为什么要使用泛型-----1》泛型意味着编写的代码可以被许多不同类型的对象所重用-----2》编译时,避免了插入错误的数据对象;使得程序具有更好的可读性和安全性二、定义简单泛型:ArrayList array=new ArrayList();三、泛型方法-----1》public static T getname(T...a){};-----2》类型原创 2016-03-17 20:36:04 · 418 阅读 · 0 评论 -
Java学习笔记-异常
一、处理错误---》异常分类Error类:描述了Java运行时系统的内部错误和资源耗尽错误(程序不应该抛出)(未检查异常)Exception类:分为两类:一个是RuntimeException类,另一个是表示其他错误其中-------1》RuntimeException:包括错误的类型转换,数组访问越界,空指针(属于编程人员的问题)(未检查异常)----------原创 2016-03-17 18:49:09 · 396 阅读 · 0 评论