JDK

CAS(乐观锁)

大兔子大兔子 提交于 2020-12-04 01:41:09
1.什么是CAS CAS(Compare And Swap)比较并替换,是线程并发运行时用到的一种技术; 2.CAS作用 乐观锁 3.其他锁机制缺点 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁。 锁机制存在以下问题: (1)在多线程竞争下,加锁、释放锁会导致比较多的 上下文切换和调度延时,引起性能问题 。 (2)一个线程持有锁会导致其它所有需要此锁的 线程挂起 。 (3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致 优先级倒置 ,引起性能风险。 volatile是不错的机制,但是 volatile不能保证原子性。 因此对于同步最终还是要回到锁机制上来。 独占锁是一种悲观锁,synchronized就是一种独占锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。 4.CAS实现 CAS需要三个指令,分别是内存位置(JAVA中的内存地址,V),旧的预期值(A)和新值(B)。CAS执行时,当且仅当V符合预期A的时候,新值更新V的值,否则不执行更新,但是最终都会返回V的旧值,上述的处理过程就是一个原子操作。 (图片来源网络) 比如:要将上图中的CPU1要将56更新为57

JDK8---UnSafe类实现CAS乐观锁

喜夏-厌秋 提交于 2020-12-04 00:54:09
CAS:CompareAndSwap(比较并交换),简单点说,内存地址V,旧值为A,当要修改为新值B的时候,先判断V当前的值是不是A,如果是,则将V的值修改为B,否则失败。 那么JDK8中是怎么实现的呢?(ConCurrentHashMap、Atomic等常见线程安全类的底层实现都有它) 在sun.misc包下有一个 UnSafe类(在rt.jar包下面): public final class Unsafe { private Unsafe() { } public static Unsafe getUnsafe() { Class var0 = Reflection.getCallerClass(); if (!VM.isSystemDomainLoader(var0.getClassLoader())) { throw new SecurityException("Unsafe"); } else { return theUnsafe; } } } 构造方法私有,压根不让用。唯一暴漏的getUnsafe方法也不能使用。通过Reflection.getCallerClass() 拿到当前调用方法的实际类,从下面代码可以看到只要实际类的类加载器不为null,直接抛异常。因为rt.jar是由 bootstrap类加载器 来加载的,在Java中看不到的(null)

Java在ACM中的应用

左心房为你撑大大i 提交于 2020-12-03 22:43:17
由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些 这里指的java速成,只限于java语法,包括输入输出,运算处理,字符串和高精度的处理,进制之间的转换等,能解决OJ上的一些高精度题目。 1. 输入: 格式为:Scanner cin = new Scanner (new BufferedInputStream(System.in)); 或者、Scanner cin = new Scanner (System.in); 例程: import java.io.*; import java.math.*; import java.util.*; import java.text.*; public class Main { public static void main(String[] args) { Scanner cin = new Scanner (new BufferedInputStream(System.in)); int a; double b; BigInteger c; String st; a = cin.nextInt(); b = cin.nextDouble(); c = cin.nextBigInteger(); d = cin

构建一个属于自己的Jenkins镜像

∥☆過路亽.° 提交于 2020-12-03 16:11:36
本文目标 不使用Jenkins官方提供的镜像,从最简系统镜像搭建一个最新稳定版的Jenkins镜像 ,自定义镜像内有的工具如jdk、gradle、node等,使用Dockfile与Shell脚本搭建而成 自定义的原因是官方镜像不能满足我们对于镜像内部工具的需求 本文面向 面向对象:smile: ——本文面向有定制Jenkins镜像需求的小白兔,大神请轻喷~ 环境说明 操作系统:Centos 7 Docker版本:19.03.5 镜像内部依赖说明 基础系统镜像: ubuntu:bionic , 也就是18.04 LTS Gradle: gradle-6.0.1 JDK: jdk1.8.0_221 Node: node-v11.4.0 Jenkins: 最新stable war Dockerfile:构建镜像的蓝图 FROM ubuntu:bionic #基础镜像 #修改国内源,清华大学的 RUN echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse" > /etc/apt/sources.list && \ echo "deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates

java枚举(enum)

限于喜欢 提交于 2020-12-03 15:52:06
1. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.lang.Enum (抽象类) 类的子类。 enum AccountType { SAVING, FIXED, CURRENT; private AccountType() { System.out.println(“It is a account type”); } } 2.这段代码实际上调用了3次 Enum(String name, int ordinal),new了3次,也就执行了三次构造方法。 ew Enum<AccountType>("SAVING",0 ); new Enum<AccountType>("FIXED",1 ); new Enum<AccountType>("CURRENT",2); 3.枚举类型的每一个值都将映射到protected Enum(String name, int ordinal)构造函数中,在这里,每个值的名称都被转换成一个字符串,并且序数设置表示了此设置被创建的顺序。 4.enum 的语法结构尽管和 class 的语法不一样,但是经过编译器编译之后产生的是一个class文件。该class文件经过反编译可以看到实际上是生成了一个类,该类继承了java.lang.Enum<E>,enum可以定义一些属性和方法,.enum 不能使用 extends 关键字继承其他类

JVM垃圾回收算法你都知道吗?

社会主义新天地 提交于 2020-12-03 14:35:17
原创 java金融 java金融 3月9日 怎么判断对象"已死"? 1.引用计数法 不能解决对象循环依赖的问题。因此一般不用这种。 2.可达性分析算法。 GCRoots 不可达时 对象死,采用这个。 垃圾收集算法 1.标记清除算法 1.标记、清除阶段效率不高。 2.标记清除之后会产生大量不连续的碎片,导致分配较大的对象时候,无法找到足够的连续内存。 2.复制算法 1.两块相同的内存空间,一块使用,一块空闲,导致空间浪费。不存在碎片问题。 3.记整理算法 1.标记过程与"标记清除算法"一样,整理过程是让所有存活对象都往一端移动,然后直接清理掉边界以外的内存。 4.分代收集算法。 把对象进行分代,新生代和来年代。 总结 新生代一般用复制算法,老年代一般用标记整理或者标记清除算法。 垃圾收集器 Serial收集器 作用于新生代 单线程收集 采用复制算法 开启方式:-XX:+UseSerialGC Client模式下的默认新生代收集器。进行垃圾收集时,必须Stop the world,直到它收集结束 ParNew收集器. 作用于新生代。 多线程收集 采用复制算法 -XX:+UseParNewGC-XX:ParallelGCThreans=2(2指定垃圾收集的线程数). Server模式下的默认新生代收集器 ParallelScavenge收集器 新生代. 多线程 复制算法 -XX

程序员都应该知道的JVM参数

与世无争的帅哥 提交于 2020-12-03 14:34:24
原创 java金融 java金融 2019-09-01 Trace跟踪参数 1.-verbose:gc 2.-XX:+printGC 可以打印GC的简要信息 [GC 51790K->1374K(115872K), 0.0001606 secs] 3.-XX:+PrintGCDetails(打印GC详细信息) 4.-XX:+PrintGCTimeStamps(打印CG发生的时间戳 ) [GC[DefNew: 6716K->0K(4528K), 0.0007 secs] 8790K->374K(15872K), 0.0002232 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] - 5.-XX:+PrintGCDetails的输出 6.-Xloggc:log/gc.log (制定GC的输出位置) 7.-XX:+PrintHeapAtGC(每次一次GC后,都打印堆信息) 8.-XX:+TraceClassLoading (打印class的加载) 9.-XX:+PrintClassHistogram(按下Ctrl+C后,打印类的信息) 堆的分配参数 1.-Xmx –Xms(指定最大堆和最小堆) System.out.print("Xmx="); System.out.println(Runtime.getRuntime()

ArrayList 面试10连问

牧云@^-^@ 提交于 2020-12-03 11:36:11
** 【集合】ArrayList 10连问 ** List list = new ArrayList(); 1问:当我们new了一个ArrayList,底层new了一个什么?new了一个数组 2问:什么类型的数组?object[] 3问 : 数组的长度是多大?10 ;数组长度默认是空, add 以后 底层创建了长度是10的Object[]数组 4问:数组的长度是10,我现在要放25, 为什么没有报【数组下标越界异常】 , 容量不够,有扩容机制 5问:扩容为原来的1.5倍, ArrayList每次扩容为原值的一半,hashmap每次扩容为原值的一倍; 10 第一次扩容原值一半是 15; 6问:第二次扩容是多少?第二次扩容是15+7.5=22.5 向上取整为22;第三次扩容为33 7问:有没有看过ArrayList底层源码? 有,扩容是怎么扩的? 底层用的是什么方法? 底层用的是Arrays.copyOf elementData = Arrays.copyOf(elementData, size, Object[].class); 8问:ArrayList 是线程安全的还是线程不安全的? ArrayList是线程不安全的,你确定吗? 我确定 9问:请你写一个线程不安全的case,会报什么故障,怎么处理? 会报:java.util

【设计模式】建造者模式

社会主义新天地 提交于 2020-12-03 11:12:01
建造者模式 传统模式 建造者模式 建造者模式的四个角色 解决房子思路 建造者模式和工厂模式对比 JDK源码:StringBuilder 盖房项目需求 需要建房子:这一过程为打桩、 砌墙、封顶 房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的. 传统模式 传统方式的缺点: 过于简单,没有设计缓存层对象,程序的扩展和维护不好. 也就 是说,这种设计方案, 把产品(即:房子) 和 创建产品的过程(即:建房子流程) 封装在一起 ,耦合性增强了。 建造者模式 将产品和产品建造过程解耦 => 建造者模式 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式 。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似, 如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制 建造者模式的四个角色 Product(产品角色): 一个具体的产品对象。 Builder(抽象建造者): 创建一个Product对象的各个部件指定的 接口/抽象类。

Tomcat部署Eclipse项目实战

淺唱寂寞╮ 提交于 2020-12-03 01:24:36
1)Eclipse项目选择以Eclipse方式导入Idea; 根据报错引入JavaEE6; jdk还是用1.8; 配置好数据库密码。 2)既然为web项目,必须有web项目的设置 3)必须设置好,不然没办法在Tomcat中打包。 exploded发现没有部署为war到Tomcat 4)设置好Tomcat的配置, 尤其是jre选择1.8,而不是别的1.8.xxx,否则启动报32位的错误。 5)选择部署的jar,同时虚拟路径不要选择东西 来源: oschina 链接: https://my.oschina.net/u/4290180/blog/4770242