- 博客(31)
- 收藏
- 关注
原创 Java内存模型
每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。第一个是保证此变量对所有线程的可见性。主内存与工作内存之间具体的交互协议,即一个变量如何从主内存拷贝到工作内存、如何从工作内存同步回主内存之类的实现细节,Java内存模型中定义了8种操作来完成,虚拟机实现时必须保证每一种操作都是原子的、不可再分的。作用于主内存的变量,把一个变量的值从主内存传输到线程的工作内存,以便随后的load操作使用。
2024-01-24 22:22:52 969 1
原创 终于理解java注解了
下面是一个自定义注解的栗子。在这个例子中,自定义了@DBTable注解,用于表明要为有该注解的类生成建表语句,@Constraints、@SQLString、@SQLInteger注解表示数据库表字段相关的属性。/*** 标记类是一张表*//*** 表名*//*** 字段属性*//*** 是否主键*//*** 是否允许为空*//*** 是否唯一*//*** 数据库字符串类型*//*** 字段长度*//*** 字段名称*//**
2024-01-24 22:13:50 374
原创 红黑树java实现
对于一棵红黑树,哨兵是一个与树中的普通结点有相同属性的对象。当对树执行插入或操作时,对树做了修改,所做的修改可能会导致树不满足红黑树的性质,因此需要进行旋转来维护红黑树的性质。如果一个结点没有子结点或父结点,则该结点相应属性的值为null。一棵红黑树是满足下面。通过对任何一条从根到叶子的简单路径上各个结点的颜色进行约束,红黑树确保没有一条路径会比其他路径长出2倍,因而是。红黑树是一课二叉搜索树,它在每个结点上增加了一个存储位来表示结点的。下面是使用java简单实现了红黑树,以及红黑树的插入和删除操作。
2023-11-23 00:08:17 363
原创 二叉搜索树java实现
顾名思义,二叉搜索树是一棵二叉树,每个节点就是一个对象,这个对象包含属性left、right和parent。left指向节点的左孩子,right指向节点的右孩子,parent指向节点的父节点(双亲)。如果某个孩子节点和父节点不存在,则相应的属性为null。根节点是树中唯一父节点指针为null的节点。
2023-11-23 00:04:10 124
原创 栈和队列java实现
栈和队列都是动态集合,且在其上进行DELETE操作所移除的元素是预先设定的。在栈中,被删除的是最近插入的元素:栈实现的是一种策略。在队列中,被删去的总是在队列中存在时间最长的那个元素:队列实现的是一种策略。
2023-11-21 20:43:33 65
原创 一种选择数组中第 i 小元素的线性时间算法
本算法以快速排序算法为模型。与快速排序一样,仍然将输入的数组进行递归划分。假设要从数组A[start…介绍一种解决选择问题的分治算法,该算法从一个有n个元素的数组中选择第i(i为[1…
2023-11-21 14:39:02 61
原创 桶排序java实现
桶排序将[0,1)区间划分为n个相同大小的子区间,或称为桶。然后将输入数分别放到各个桶中。因为输入的数据是均匀、独立地分布在[0,1)区间,所以一般不会出现很多数落在同一个桶中的情况。为了得到输出结果,先对每个桶中的数据进行排序,然后遍历每个桶,按照次序把各个桶中的元素列出来即可。在代码实现的过程中,需要用链表来表示桶,在java中,可以使用LinkedList表示。,假设输入的数据由一个随机过程产生,该过程将元素。桶排序假设输入的数据服从。
2023-11-20 20:39:01 167
原创 计数排序java实现
计数排序的基本思想是:对每一个输入元素x,确定小于x的元素个数。利用这一信息,就可以直接把x放到它在输出数组中的位置上。例如,如果有17个元素小于x,则x就应该在第18个输出位置上。根据这个思想,对于一个A[1…计数排序假设n个输入元素中的每一个都是在0到k区间的一个整数,其中k为某个整数,当k=O(n)时,排序的运行时间为θ(n)。
2023-11-20 19:03:51 287
原创 JVM线程安全与锁优化
《Java Concurrency In Practice》的作者Brian Goetz对线程安全的定义:当多个线程访问一个对象时,如果不用老驴这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。Java语言中的线程安全按照线程安全的“安全程度”由强至弱排序,可以将Java语言中各种操作共享的数据分为5类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 不可变 在Jav
2021-07-17 15:30:04 90
原创 JVM中的Java线程
线程的实现方式主要有3种: 使用内核线程实现 使用用户线程实现 使用用户线程加轻量级进程混合实现 使用内核线程实现内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。每个内核线程可以视为内核的一个分身,这样操作系统就有能力同时处理多件事情,支持多线程的内核就叫做多线程内核。程序一般不会直接去使用内核线程,而是去使用内核线程的一种高级接
2021-07-16 22:53:37 133
原创 Java并发中的内存模型
主内存与工作内存Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量包括实例变量、静态字段和构成数组对象的元素,但不包括局部变量与方法参数,因为局部变量与方法参数是线程私有的,不会被共享,不会存在竞争问题。Java内存模型规定了所有变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之
2021-07-14 22:38:22 78
原创 JVM类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。Java运行期动态加载和动态连接的特点使得Java天生就具有动态扩展的语言特性。类加载的时机类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initializ
2021-07-10 21:54:02 67
原创 一点JVM字节码指令介绍
Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码)以及跟随其后的零至多个代表此操作所需参数(操作数)构成。字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构,由于限制了Java虚拟机操作码的长度为一个字节,所以指令集的操作码总数不可能超过256条。加载和存储指令 将一个局部变量加载到操作栈 iload、iload_<n>、lload、lload_<n>、fload、fload_<n>、dload、dload_<n&g
2021-07-10 02:52:49 76
原创 JVM内存分配策略
Minor GC与Full GCMinor GC:新生代GC,指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。Full GC:老年代GC,或者Major GC。指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(并非绝对,比如在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程),Major GC的速度一般会比Minor GC慢10倍以上。分配策
2021-07-04 18:52:01 90
原创 HotSpot虚拟机垃圾收集器
备注:基于JDK1.7 Update 14之后的版本。Serial收集器Serial收集器是最基本、发展历史最悠久的收集器,在JDK1.3.1之前是虚拟机新生代收集的唯一选择。Serial收集器是一个单线程的收集器,需要注意的是这里的“单线程”并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,而是它在进行垃圾收集时,必须暂停其他所有的工作线程,直到收集结束。即Stop The World。收集器运行过程如下:特点: 简单高效,对于限定单个CPU的环境来说,Serial收集器由
2021-07-04 18:32:33 97
原创 垃圾收集算法
垃圾收集需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收? 哪些内存需要回收什么是引用在JDK1.2以前,Java中对引用的定义:如果reference类型的数据中存储的数据代表的是另外一块内存的起始地址,就成这块内存代表着一个引用。 缺点: 定义太过狭隘,对于如何描述一些“食之无味,弃之可惜”的对象显得无能为力。在JDK1.2之后,Java将引用分为强引用、软引用、弱引用和虚引用。 强引用 强引用就是指在程序代码之中普遍存在的,类似“Obj
2021-07-03 23:48:33 79
原创 java虚拟机内存模型
Java虚拟机的运行时数据区由程序计数器、java虚拟机栈、本地方法栈、Java堆、方法区、运行时常量池以及直接内存构成。构成图如下:程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码行号指示器。由于Java虚拟机的多线程是通过线程切换并分配处理器执行时间的方式来实现的,在任何一个确定的实可,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们成这类内存区域为“线
2021-06-28 22:53:13 122
原创 linux与linux之间共享目录
1.安装必要的包 nfs-utils rpcbind (nfs是基于sun公司的rpc通信实现的,所以要装rpcbind)这2包,在服务端和客户端都需要安装,并启动服务。启动 service rpcbind start service nfs start (顺序不能变,nfs依存rpc,所以先启动rpcbind后启动nfs)开机启动 chkconfig ...
2018-09-13 21:55:33 3744
原创 Hadoop Mapreduce 中的Partitioner
Partitioner的作用的对Mapper产生的中间结果进行分片,以便将同一分组的数据交给同一个Reduce处理,Partitioner直接影响Reduce阶段的负载均衡。MapReduce提供了两个Partitioner实现:HashPartitioner和TotalOederPartitioner。HashPartitioner是默认实现,实现了一种基于哈希值的分片方法,代码如下:...
2018-08-13 23:19:33 247
原创 Haoop Mapreduce 中的FileOutputFormat类
FileOutputFormat类继承OutputFormat,需要提供所有基于文件的OutputFormat实现的公共功能。主要有以下两点:(1)实现checkOutputSpecs方法checkOutputSpecs方法一般在作业被提交到JobTracker之前,由JobClient自动调用,以检查输出目录是否存在,如果目录存在则抛出异常,以防止之前的数据被覆盖。(2)处理side-...
2018-08-13 23:14:41 532
原创 Hadoop Mapreduce 中的FileInputFormat类的文件切分算法和host选择算法
文件切分算法 文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段。 FileInputFormat以文件为单位切分成InputSplit。对于每个文件,由以下三个属性值确定其对应的InputSplit的个数。goalSize:根据用户期望的InputSplit数据计算,即totalSize/numSplit。totalSize为文件总大小;numS...
2018-08-12 20:57:54 688
原创 python求两个链表组成的数字的和
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807代码实现:# Definition for singl...
2018-04-21 02:41:59 955
原创 python实现给定一个数和数组,求数组中两数之和为给定的数
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]代码实现: def twoSum(self, nums, target): nums_...
2018-04-21 02:33:29 6029
转载 jieba词性标注
Ag 形语素 形容词性语素。形容词代码为a,语素代码g前面置以A。a 形容词 取英语形容词adjective的第1个字母。ad 副形词 直接作状语的形容词。形容词代码a和副词代码d并在一起。an 名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起。b 区别词 取汉字“别”的声母。c 连词 取英语连词conjunction的第1个字母。Dg 副语素 副词性语素。副词代码为d,语素代码g前...
2018-04-15 14:23:30 1353
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人