自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

轻描淡写

蜗牛赛跑

  • 博客(18)
  • 收藏
  • 关注

原创 JMM (JAVA内存模型)

JMM (JAVA内存模型)内存屏障、重排序这些东西好像是和平台以及硬件架构有关系的。作为 Java 语言的特性,一次编写多处运行。我们不应该考虑平台相关的问题,并且这些所谓的内存屏障也不应该让程序员来关心JMM 全称是 Java Memory Model. 什么是 JMM 呢?通过前面的分析发现,导致可见性问题的根本原因是缓存以及重排序。 而 JMM 实际上就是提供了合理的禁用缓存以及禁止重排序的方法。所以它最核心的价值在于解决可见性和有序性JMM 属于语言级别的抽象内存模型,可以简单理解为对硬件

2021-05-30 18:13:17 154 1

原创 Happens - Before 规则

Happens - Before 规则表示的是前一个操作的结果对于后续操作是可见的,表达多个线程之间对于内存的可见性;告诉开发者哪些场景下会存在可见性问题,因为并不是所有的程序指令都会存在可见性和指令重排序问题。程序顺序规则一个线程中的每个操作,happens-before 于该线程中的任意后续操作; 可以简单认为是 as-if-serial,不管程序如何重排序,单线程的执行结果一定不会发生变化。volatile 变量规则对于 volatile 修饰的变量的写的操作,一定 happen-b

2021-05-30 17:58:24 113

原创 查看运行代码的汇编指令的工具

将hsdis-amd64.dll和hsdis-amd64.lib文件,复制到JRE_HOME/bin/server路径下在运行main函数之前,加入虚拟机参数// *CLassLayoutDemo.getInstance 替换成实际运行的代码-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*CLassLayoutDemo.getInstance...

2021-05-30 16:28:02 157

原创 synchronized(锁的升级过程)

synchronized可以解决【原子性、有序性、可见性问题、[对象逃逸]】,也就是解决了线程安全问题线程安全概念:在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。本质是管理对数据状态的访问数据是共享的,在线程生命周期里是变化的锁的状态假如有两个线程 ThreadA 和 ThreadB只有线程 ThreadA 去访问(如果这种情况属于大部分情况时)–》偏向锁ThreadA 和 ThreadB

2021-05-30 16:02:21 126

原创 java基本数据类型大小和单位换算

单位换算1Byte=8bit1KB=1024Byte(字节)=8*1024bit1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB类型32位64位boolean1 byte1 bytebyte1 byte1 bytechar2 byte2 byteshort2 byte2 byteint4 byte4 bytefloat4 byte4 bytelong8 byte8 byte

2021-05-30 11:37:08 595

原创 对齐填充的目的

概念cup一次读取的数据是缓存行,按块(x86架构64位计算机中是64字节)进行读取,也就是说缓存行是CUP与内存交互的最小工作单元没有对齐填充时,A线程只想要读取一个long类型的变量a,但a只占8字节,因此会连带变量b、c、d也会一并读取到缓存行中;而同一时刻B线程只想要读取一个long类型的变量b,但b只占8字节,因此会连带变量a、c、d也会一并读取到缓存行中;那么这种情况下就会存在伪共享问题,这会导致A和B线程在进行数据操作时会频繁地直接去内存获取最新值,而不是从高速缓存中获取(也就是缓存失效)

2021-05-30 11:16:51 997 3

原创 线程的状态(生命周期)

线程认识进程(Process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。线程的引入:60年代,在OS中能拥有资源和独立运行的基本单位是进程,然而随着计算机技术的发展,进程出现了很多弊端,一是由于进程是资源拥有者,创建、撤消与切换存在较大的时空开销,因此需要引入轻型进程;二是由

2021-05-30 08:58:27 87 1

原创 查看对象在内存中布局

引入jar包 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9</version> </dependency>使用案例package com.tiger;import org.openjdk.jol.info.Cl

2021-05-29 22:03:27 124

原创 主业务与RPC事务传播

主业务逻辑中有N个sql,中间进行了RPC,正常来说,主业务中某条sql出异常,所有数据全部回滚,但现在出现RPC中执行的sql不会自动回滚解决方案?

2021-05-20 14:48:19 573

原创 静态导入

import static io.netty.handler.codec.http.HttpHeaders.Names.*;import static io.netty.handler.codec.http.HttpHeaders.isKeepAlive;import static io.netty.handler.codec.http.HttpHeaders.setContentLength;import static io.netty.handler.codec.http.HttpMethod..

2021-05-04 21:54:29 104

原创 为什么选择Netty作为NIO网络编程的首选框架

不选择原生NIO进行网络编程的原因NIO的类库和API繁琐,使用麻烦,开发者必须熟练掌握Selector、SeverSocketChannel、SocketChannel、ByteBuffer等需要具备额外的技能作为铺垫,例如熟悉多线程编程,这是由于NIO编程设计Reactor模式,你必须对多线程非常熟悉,才能编写出高质量的NIO程序。可靠性能力补齐,工作量和难度非常大。JDK NIO 的BUG使用NIO框架Netty开发的理由API使用简单,开发门槛低功能强大,预置多种编解码功能,支持

2021-05-04 10:52:52 208

原创 I/O多路复用技术

I/O多路复用技术在I/O编程过程中,当需要同时处理多个客户端接入请求时,可以利用多线程或者I/O多路复用技术进行处理。I/O多路复用技术通过把多个I/O的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统的多线程模型比,I/O多路复用技术的最大优势是系统开销小,系统不需要创建额外进程或者线程,也不需要维护这些进程或线程的运行。支持的I/O多路复用技术 select pseelct poll epoll

2021-05-03 19:02:53 259

原创 NIODemo

package com.tiger.io.nio;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSo.

2021-05-03 00:59:14 371

原创 内存映射 - MappedBuffer

package com.tiger;import java.io.IOException;import java.io.RandomAccessFile;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;/** * 内存映射是一种读和写文件数据的方法,它可以比常规基于流或基于通信管道IO快得多, * 内存映射文件IO是通过使文件中的数据出现为内存数组的内容来完成,这似乎是将整个文件读到内存,但事实并.

2021-05-02 19:45:06 540

原创 直接缓冲区 - DirectByteBuffer - 拷贝文件

package com.tiger;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;/** * 直接缓冲区,为了加快IO速度,使用一种特殊的方式为其分配内存的缓冲区, * JDK文档描述:给定一个直接字节缓冲区,java虚拟机将尽.

2021-05-02 18:49:07 476

原创 只读缓冲区 - ReadOnlyBuffer

package com.tiger;import java.nio.ByteBuffer;/** * 只读缓冲区, * 通过调用现有缓冲区的asReadOnlyBuffer()方法将任意常规缓冲区转换为只读缓冲区, * 这个方法返回一个与原缓冲区完全相同的缓冲区,并与原缓冲区共享数据,只不过它是只读的, * 如果原缓冲区内容发生变化,那么只读缓冲区也会发生变化。 * 但position和limit可以不同,拷贝的时候是拷贝当前缓冲区所有特性 * * @description: * .

2021-05-02 14:08:12 412

原创 缓冲区分片 - BufferSlice

package com.tiger;import java.nio.ByteBuffer;/** * 缓冲区分片案例 * 在现有缓冲区对象中创建一个子缓冲区,即在现有缓冲区上切出一片作为一个新的缓冲区, * 但现有缓冲区与创建的子缓冲区在底层数组层面上是数据共享; * 也就是说,子缓冲区相当于是现有缓冲区的一个视图窗口 * * @description: * @author: tiger * @create: 2021-05-02 10:05 */public class By.

2021-05-02 11:47:43 586

原创 缓冲区 - ByteBuffer

package com.tiger;import java.nio.IntBuffer;/** * @description: * @author: tiger * @create: 2021-05-02 10:05 */public class ByteBufferDemo { public static void main(String[] args) { IntBuffer buffer = IntBuffer.allocate(8); ...

2021-05-02 11:18:55 145

空空如也

空空如也

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

TA关注的人

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