
Java 语言
文章平均质量分 78
清涵
向着光,都是无畏者
展开
-
CLH Lock 原理
背景SMP(Symmetric Multi-Processor)对称多处理器结构,它是相对非对称多处理技术而言的、应用十分广泛的并行技术。在这种架构中,一台计算机由多个CPU组成,并共享内存和其他资源,所有的CPU都可以平等地访问内存、I/O和外部中断。虽然同时使用多个CPU,但是从管理的角度来看,它们的表现就像一台单机一样。操作系统将任务队列对称地分布于多个CPU之上,从而极大地提高了整个系统的数据处理能力。但是随着CPU数量的增加,每个CPU都要访问相同的内存资源,共享资源可能会成为系统瓶颈,导致C原创 2021-01-05 14:10:11 · 762 阅读 · 0 评论 -
ThreadLocal原理与使用注意点
什么是ThreadLocal变量ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就不存在多线程间共享的问题。ThreadLocal 提供了线程本地的实例。它与普通变量的区别在于,每个使用该变量的原创 2021-01-04 17:06:12 · 445 阅读 · 0 评论 -
深入浅出NIO
Java NIO由以下核心部分组成BufferChannelSelectorBufferByteBufferShortBufferFloatBufferCharBufferIntBufferLongBufferDirectByteBufferHeapByteBufferBuffer属性以及相关操作属性说明capacity 容量Buffer所能够存放的最大容量position 位置下一个被读或写的位置limit 上界可供读写的最大位置,原创 2021-01-04 17:04:55 · 139 阅读 · 0 评论 -
JAVA线程池的使用
Java中提供线程池newCachedThreadPool可缓存线程池,若线程池长度超过处理需要,则回收空线程,否则创建新线程,线程规模可无限大。ExecutorService cachedThreadPool = Executors.newCachedThreadPool();newFixedThreadPool定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。ExecutorService fixedThreadPool = Executors.newFixedThreadPoo原创 2020-12-13 14:07:44 · 253 阅读 · 0 评论 -
重入锁于不可重入锁
重入锁定义所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。synchronized 和 ReentrantLock 都是可重入锁可重入锁的意义在于防止死锁不可重入锁不可重入锁与上面对应,也是以线程为单位,只能获取一次,再次获取时会产生死锁的现象。重入锁代码示例public class ReLock { boolean isLocked = false; Thread lockedBy = null;原创 2020-12-10 16:28:42 · 178 阅读 · 1 评论 -
理解CAS算法
CAS(Compare And Swap)比较交换在线程开启的时候,会从主存中给每个线程拷贝一个变量副本到线程各自的运行环境中,CAS算法中包含三个参数(V,E,N),V表示要更新的变量(也就是从主存中拷贝过来的值)、E表示预期的值、N表示新值。实现过程假如现在有两个线程t1,t2,,他们各自的运行环境中都有共享变量的副本V1、V2,预期值E1、E2,预期主存中的值还没有被改变,假设现在在并发环境,并且t1先拿到了执行权限,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次发起尝试,然后原创 2020-12-10 14:30:43 · 447 阅读 · 0 评论 -
过滤器,拦截器,监听器
过滤器 拦截器 监听器的区别过滤器过滤器依赖函数回调过滤器依赖servlet容器过滤器几乎对所有的请求起作用过滤器不能访问action的上下文对象过滤器只在容器初始化时调用一次拦截器拦截器依赖java的反射机制拦截器不依赖servlet容器拦截器只能对对应的action起作用拦截器可以被多次调用拦截器可以访问IOC容器监听器做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等随着web容器启动初始化,web容器停止而销毁触发时机原创 2020-12-10 14:08:30 · 153 阅读 · 0 评论 -
maven插件开发----HelloWorld
maven插件开发最近在工作中遇到一个问题是在打包的过程中要对一些文件做替换签名,原来都是找到编译过后的文件,进行签名,然后导出jar包,这样每次都是重复的劳动,后来想能不能在每次打包发布的时候自动来做这件事,后来找了maven插件发现没有符合需求的插件,只能动手去写插件,下面介绍的是简单的一个插件的编写创建一个maven工程(也可以用命令直接生成)工程创建(我选择的是最笨的办...原创 2018-08-25 22:50:30 · 487 阅读 · 0 评论 -
channel代码示例
channel代码示例package cn.com.github.immortals;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.RandomAccessFile;import java原创 2017-05-01 19:39:26 · 29098 阅读 · 1 评论 -
NIO中的缓冲区
一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据根据数据类型不同(boolean 除外),提供了相应类型的缓冲区:ByteBufferCharBufferShortBufferIntBufferLongBufferFloatBufferDoubleBuffer上述缓冲区的管理方式几乎一致,通过 allocate() 获取缓原创 2017-05-01 11:27:17 · 564 阅读 · 0 评论 -
NIO Buffer代码示例
Buffer的代码示例NIO中bufferimport java.nio.ByteBuffer;import org.junit.Test;public class TestBuffer { @Test public void testBuffer() { //创建一个缓冲区 ByteBuffer buf = ByteBuffer.allocate(10原创 2017-05-01 16:38:30 · 423 阅读 · 0 评论 -
NIO中通道(Channel)
一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。Channel 本身不存储数据,因此需要配合缓冲区进行传输。二、通道的主要实现类(java.nio.channels.Channel)java.nio.channels.Channel |----FileChannel |----SocketChannel |----Ser原创 2017-05-01 16:32:12 · 581 阅读 · 0 评论 -
Java线程停止的方法
Java线程停止的方式可以调用stop()方法,但是该方法已经被停用,同时该方法会使线程当前未完成的任务丢失可以调用interrupt()方法标记当前线程为停止状态,在线程中调用isInterrupted()方法,如果该方法返回true,进行停止线程操作(return,throw),interrupt、interrupted 、isInterrupted 详解下面演示线程的两种停止方法stop原创 2017-03-06 15:52:01 · 661 阅读 · 0 评论 -
利用数组实现单向队列
队列就是允许在末尾添加元素,在头shanchuyuansu原创 2014-07-07 18:05:13 · 716 阅读 · 0 评论 -
Java虚拟机运行时内存区域
Java运行数据区域:方法区堆虚拟机栈本地方法栈程序计数器方法区域堆为内存共享区域,虚拟机栈、本地方法栈和程序计数器为线程私有方法区:存储被虚拟机加载类的信息、常量、静态变量、即时编译器编译后的代码数据等。运行时常量池:Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项是常量池,用于存放编译期生成的字原创 2017-02-20 19:14:12 · 311 阅读 · 0 评论 -
JVM对象的创建与访问
对象创建的两种方法:指针碰撞:指针碰撞的前提条件是java堆内存是绝对规整的,所用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,分配内存就是将指针想空闲区域移动一个与对象内存相等的区域。空闲列表:虚拟机维护一个列表,记录那些内存是可用的,在分配的时候找到一块大小足够用的内存分配给对象。采用哪种内存分配方式创建对象取原创 2017-02-20 19:16:29 · 686 阅读 · 0 评论 -
windows配置jdk
先下载jdk,自己去官网下就行,然后安装,建议jdk和jre都安装到d盘下然后开始配置环境变量。例如你安装的路径是D:\Program Files\Java\jdk1.7.0_51,那就把这个地址复制下来,然后右键我的电脑->属性高级系统设置环境变量新建JAVA_HOME,把你安装的路径复制进去最后在path变量前加入%JAVA_HO原创 2014-07-08 19:51:44 · 530 阅读 · 0 评论 -
关于spring整合hibernate 懒加载异常解决方案
最近在做spring整合hibernate的项目,把hibernate的事物交给spring管理,但是在懒加载的时候出现的在懒加载时候session的时候这个时候已经关闭了,导致懒加载异常,这个时候本着有事找百度的态度,在百度上搜索全都是一样的,在web.xml或者在spring MVC中配置懒加载信息,而且在百度上的都是一样的,后来看了一下官方文档,在hibernate配置内加一句话就行了,真心原创 2015-09-13 17:25:24 · 1497 阅读 · 0 评论 -
Java垃圾回收时对对象的标记分析
引用计数法(Java未使用)给对象添加一个引用计数器,对象被引用加一,引用失效时计数器减一可达性分析法(Java虚拟中使用的方法)枚举出根节点,根据根节点向下分析,与根节点有引用关系的视为存活对象,与根节点没有关系则可以回收java引用类型强引用-----指程序代码中普遍存在的,类似Object obj = new Object(),只要强引用存在则原创 2017-02-23 14:37:28 · 714 阅读 · 0 评论 -
Java内存回收算法
标记-清除算法分为标记和清除两个阶段:首先标记处需要回收的对象,在完成标记统一回收所有被标记的对象缺点:效率问题,标记和清除两个过程效率都不高空间问题,标记清除后悔产生大量不连续的内存碎片,导致一些大对象可能无法分配复制算法(商用虚拟机采用的算法)将内存划分成大小相等的两个部分,每次只是用其中的一块,当这一块内存使用完了,将还存活的对象复制到另外一块上,原创 2017-02-23 14:59:43 · 448 阅读 · 0 评论 -
java线程两种实现形式
java中线程实现有两种方式,java.lang.Thread与java.lang.Runnable.java.lang.Thread实现了java.lang.Runnable,同时封装了一些线程常用的方法包括一些本地方法等java.lang.Runnable是一个接口,实现该接口时写run()方法,run()方法中是线程实现的主体 下面代码演示了两种线程简单的实现public clas原创 2017-03-06 13:37:00 · 473 阅读 · 0 评论 -
interrupt、interrupted 、isInterrupted 详解
interrupt()interrupt方法用于中断线程。调用该方法的线程的状态为将被置为”中断”状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。isInterrupted(原创 2017-03-06 15:24:17 · 699 阅读 · 0 评论 -
java线程间通讯
package com.sky.thread1;class Product { int n; boolean valueSet = false; synchronized void get() { if (!valueSet) { try { wait(); } catch (Exception e) { e.printStackTrace();原创 2014-07-01 20:02:01 · 704 阅读 · 0 评论