自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 【Java I/O】同步异步 阻塞非阻塞

阻塞与非阻塞从简单的开始,我们以经典的读取文件的模型举例。(对操作系统而言,所有的输入输出设备都被抽象成文件。)在发起读取文件的请求时,应用层会调用系统内核的 I/O 接口。如果应用层调用的是阻塞型 I/O,那么在调用之后,应用层即刻被挂起,一直出于等待数据返回的状态,直到系统内核从磁盘读取完数据并返回给应用层,应用层才用获得的数据进行接下来的其他操作。如果应用层调用的是非阻塞 I...

2019-03-17 13:38:28 183

原创 【Java并发编程】ReentrantLock

概述ReentrantLock是基于AQS构建的,AQS中有一个表示状态的字段state,ReentrantLock用它表示线程重入锁的次数,Semaphore用它表示剩余的许可数量,FutureTask用它表示任务的状态。对state变量值的更新都采用CAS操作保证更新操作的原子性。类的结构ReentrantLock类实现了Lock和java.io.Serializable接口,其...

2019-03-11 21:07:26 303

原创 【Java并发编程】之AQS

概述虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。AQS:AbstractQueuedSynchronizer,即队列同步器。它是构建锁或者其他同步组件的基础框架。它提供了一套完整的同步编程框架,开发人员只需要实现其中几个简单的方法就能自由的使用诸如独占,...

2019-03-11 16:03:30 133

原创 【Java并发编程】之三个特性以及happens-before原则

原子性原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。可见性可见性是指当一个线程修改了共享变量后,其他线程能够立即得知这个修改。除了sychronized和volatile,final也具有可见性。被final修饰的字段在构造器中一旦初始化完成,并且没有this引用逃逸,那么其他线程就能看到final字段的值。有序性sychronize...

2019-03-10 13:30:30 210

原创 【Java并发编程】之sychronized锁的优化

乐观锁与悲观锁synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。 CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。CASAtomic底层的实现就是CAS。CAS是一个原子操作。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,...

2019-03-09 21:15:34 202

原创 【Java并发编程】之synchronized关键字

锁定的是对象public class T { private Object o=new Object(); private int count=10; public void m() { synchronized(o) { count--; System.out.println(Thread.currentThread().getName()+"count="+coun...

2019-03-09 20:17:53 173

原创 【Java并发编程】之volatile关键字

volatile具有可见性和有序性,一条线程修改了一个变量的值,新值对于其他线程来说是立即可知的。不具有原子性。说到volatile,必须要先将JMM以及重排序。JMM内存模型为了解决内存和CPU速度不一致,提高效率。在JMM中,每个线程有其自己私有的工作内存。共享变量会先放在主存中,每个线程都有属于自己的工作内存,并且会把位于主存中的共享变量拷贝到自己的工作内存,之后的读写操作均使用...

2019-03-09 19:41:23 127

原创 【java并发编程】关于sychronized可见性

public class T { /*volatile*/ boolean running=true; void m() { System.out.println("m start"); while(running) { } System.out.println("m end"); } public static void main(String args[]) ...

2019-03-03 16:03:23 161

原创 【Java并发编程】之一基础知识

为什么要用到并发将多核CPU的计算能力发挥到极致,性能得到提升面对复杂业务模型,并行程序会比串行程序更适应业务需求,而并发编程更能吻合这种业务拆分并发的缺点线程安全问题(死锁)频繁的上下文切换一些概念并发与并行:Concurrency is about dealing with lots of things at once. Parallelism is about d...

2019-03-01 20:15:38 186

原创 深入理解JVM之垃圾回收机制

概述GC需要完成的三件事:哪些对象需要回收?何时进行回收?怎么回收?程序计数器,虚拟机栈,本地方法栈不需要考虑垃圾回收的机制,因为栈帧随着方法的开始和结束而进行入栈和出栈的操作。所以需要进行垃圾回收机制的也就是堆和方法区。哪些对象需要回收?如何判断对象已死?可达性分析算法和finalize()方法。可达性分析把一系列称为"GC Roots"的对象作为起点,向下进行搜...

2019-02-28 20:37:36 229

原创 深入理解JVM之运行时数据区域

运行时数据区域包括程序计数器,java虚拟机栈,本地方法栈,方法区和堆。其中,java虚拟机栈,本地方法栈,程序计数器是每个线程私有的。程序计数器可以看作是当前线程执行到的字节码的行号指示器。对于Java的多线程,为了使程序每次切换后能够恢复到正确的执行位置,因此每一个线程必须要有自己独立的程序计数器。如果线程执行的是Java方法,记录的是正在执行的虚拟机字节码指令的地址(如果正在执行...

2019-02-28 19:34:29 161

原创 String的本质

String内存位置基本类型的变量数据和对象的引用都是放在栈里面,String常量放在常量池里面,String对象是放在堆里面。常量池是放在方法去里面的,从jdk7开始就移到了堆里面。String常量:String s1="hello";String s2="hello";System.out.println(s1==s2);第一句代码执行后就在常量池中创建了一个值为he...

2019-02-25 21:26:37 1051

原创 String之String的定义方法

直接定义过程:String s1="myString";在程序编译期,编译程序先去字符串常量池检查,是否存在“myString”,如果不存在,则在常量池中开辟一个内存空间存放“myString”;如果存在的话,则不用重新开辟空间。然后在栈中开辟一块空间,命名为“s1”,存放的值为常量池中“myString”的内存地址。通过关键字new定义过程:String s2=new Strin...

2019-02-25 21:24:16 4110

原创 String之String与StringBuiilder

我们都知道,String的内部实现是一个用final的数组,因此String对象是不可变的,我们每次修改String时,实际上都是new出来了一个新的对象。因此,对于经常进行字符串的修改操作时,String类就需要不断创建新对象,性能极低。StringBuilder内部也是封装的一个字符数组,只不过该数组非final修饰,可以不断修改。所以对于一些经常需要修改字符串的情况,我们应首选StringB...

2019-02-25 21:03:18 345

原创 深入理解JVM笔记之入门

Java虚拟机结构: 运行时区域虚拟机栈:每一个线程都有一个虚拟机栈,线程中每调用一个方法都会开启一个栈帧,栈帧里面保存方法中的局部变量。所以,不同栈帧里面即使变量名相同也不会有冲突的。栈帧:每一个线程每一个方法都会开启一个栈帧。堆:存放对象实例,最大一块内存。方法区:也叫永久区。class文件,常量,静态变量。程序计数器:每一个线程都有一个独立的程序计数器。记录的是当...

2019-01-29 21:59:45 309

原创 控制反转和依赖注入

控制反转是一种思想,依赖注入是控制反转的一种实现方式。为了实现松耦合,我们采取了控制反转的思想。什么是依赖?如果一个类A的功能实现要借助B,那么就叫B是A的依赖,则称作A依赖于B。比如说,一个人喜欢看视频,而他看视频需要借助手机来实现,则称他依赖于手机。依赖倒置依赖倒置原则:上层模块不应该依赖底层模块,它们都应该依赖于抽象。 抽象不应该依赖于细节,细节应该依赖于抽象在...

2019-01-24 14:17:50 267

空空如也

空空如也

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

TA关注的人

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