首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ArrayList 的全面突击

后台 Java 1.2 引入了强大丰富的 Collection 框架,其中用 ArrayList 来作为可动态扩容数组的列表实现来代替 Array 日常开发的使用,ArrayList 实现所有列表的操作方法...的扩容操作发生在添加方法,并且满足一定条件才会发生。...grow 方法之中,并且只有当数组长度小于所需要的最小容量执行:当数组存储元素已满,无法再存储将新加入的元素。...接下来就是通过循环将包含的所有元素写出到,在这一步可以看出 ArrayList 自己实现的序列化方法没有将无存储数据的内存空间进行序列化,节省了空间和时间。...同样地,反序列化根据读进来的数据获取 size 属性,然后进行数组的扩容,最后将数据读到的所有元素数据存放到持有的对象数组

68940

java"小心机"(1)【资源彩蛋!】

我们来看下以下例子两个方法 void f() {}; int f() { return 1; }; 调用方法注重返回值,比如在int i = f(),确实可以区分重载方法。...(代码简洁与可读性的取舍,结合实际情况吧) 3.自自减的前后缀式(初学者较难理解的点) 前缀式:先执行运算,再生成结果 后缀式:先生成结果,再执行运算 import static java.lang.System...(2)一文中就有提到Integer的常量池,其实java基本类型的包装类的大部分都实现了常量池技术。...对包装类进行赋值,字面量值[-128,127]间,将使用常量池中对象,反之则创建新的对象。...(可看java面试|精选基础题(2)文中第一题)将基本类型赋值给包装类,实际上执行了包装类的valueOf方法

42210
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解JVM(③)学习Java的内存模型

主内存与工作内存 Java内存模型的主要目的是定义程序各种变量的访问规则,即关注虚拟机把变量值存储到内存和从内存取出变量值这样的底层细节。...内存间交互操作 对于主内存和工作内存之间具体的交互协议,Java内存模型定义了以下8操作拉完成。 Java虚拟机实现时必须保证下面提及的每一种操作都是原子的、不可再分的。...普通的变量金辉保证方法执行过程中所有依赖复制结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码执行顺序一致。...原子性、可见性、有序性 Java内存模型是围绕着并发过程如何处理原子性、可见性和有序性这三个特征来建立的。...可见性 可见性就是指当一个线程修改了共享变量值,其他线程能够立即得知这个修改。

35010

Java并发的CAS原理详解

乐观锁和悲观锁的概念请参考Java的21种锁。 Javajava.util.concurrent.atomic包下面的原子变量就是使用了乐观锁的一种实现方式CAS实现。...调用UnSafe类的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作。...三、写几行代码讲一下CAS 讲volatile,讲到了如何使用原子整型类AtomicInteger来解决volatile的非原子性问题,保证多个线程执行num++的操作,最终执行的结果与单线程一致,输出结果为...所以比较后,发现变量没被其他线程修改,可以进行替换,替换值为var5+var4=11,变量值替换后为 11,也就是自1。这行代码执行结果返回true(自成功),退出do while循环。...当对一个共享变量执行操作,我们可以通过循环CAS的方式来保证原子操作 但是对于多个共享变量操作,循环CAS就无法保证操作的原子性,这个时候只能用锁来保证原子性 引出来ABA问题(第1步读取的值是

77320

精选21道Java后端面试题,看完你也能唬住面试官拿30K

如何用数组实现队列? 用数组实现队列要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。 2....JDK8之后,编译器不要求内部类访问的局部变量必须被final修饰,但局部变量值不能被修改(无论是方法还是内部类),否则会报编译错误。...Java IO面向意味着每次从读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动的数据。如果需要前后移动从读取的数据,需要先将它缓存到一个缓冲区。...所以多线程环境下存在问题。 要解决自操作多线程环境下线程不安全的问题,可以选择使用Java提供的原子类,如AtomicInteger或者使用synchronized同步方法。... Java 应用程序执行期间,同一对象上多次调用 hashCode 方法,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改(equals默认返回对象地址是否相等)。

52120

Jacoco字节码插桩案例

字节码注入与控制 1 注入方式 JaCoCo是一个被广泛使用的JAVA覆盖率统计工具,它利用ASM库,通过注入字节码的方式来修改和生成java字节码,从而记录程序的执行数据,但它不会改变原有代码的行为...implementation.png 当然本文中,笔者将介绍Jacoco的具体注入方式,因此,我们使用Jaccoco Offline 的模式,在编译直接将覆盖率统计的探针(Probe)注入(Inject...2 Probe探针组成 Jacoco是通过一个Probe探针的方式来注入的,探针是字节指令集插入到java方法,程序执行后可以被记录,它不会改变原有代码的行为。...探针不改变该方法的行为,但记录他们已被执行的事实,从理论上讲,可以控制图的每一个边插入一个探针,作为探针实现本身需要多个字节码指令,这将增加几倍的类文件的大小和执行速度。...事实上,只需要一个几个探头,根据每个方法的控制方法。具体策略如下: ? ? jump.JPG ?

2.3K20

并发修改异常ConcurrentModificationException详解

一、简介 多线程编程,相信很多小伙伴都遇到过并发修改异常ConcurrentModificationException,本篇文章我们就来讲解并发修改异常的现象以及分析一下它是如何产生的。...modCount 变量值不等于expectedModCount变量值,就会触发此异常。...小结论: 集合每次调用add方法,实际修改次数的值modCount都会自1; 获取迭代器的时候,集合只会执行一次将实际修改集合的次数modCount的值赋值给预期修改的次数变量expectedModCount...原因:因为调用hasNext()方法的时候,cursor = size是相等的,hasNext()方法会返回false, 所以不会执行next()方法,也就不会调用checkForComodification...总结 以上通过几个示例讲解了并发修改异常的现象,以及分析了并发修改异常是如何产生的,实际工作,如果需要使用到删除集合中元素,那么我们不要使用集合自带的删除方法,我们应该使用iterator迭代器给我们提供的删除方法

50440

Android原生音量控制实例详解

它的实例对应在一个类型上执行静音操作的一个客户端,是实现静音功能的核心对象。 音量定义 Andorid5.1AudioSystem.java定义了有10种类型。...每种类型的音量都是相互独立的,Android也AudioService.java定义了几个数组:MAX_STREAM_VOLUME(最大音量),DEFAULT_STREAM_VOLUME(默认音量大小...//从这一小段代码可以看出,AudioService还有地方可以强行改变音量键控制的类型。...VolumeStreamState中保存的音量值是其实际值的10倍,这是为了不同类型之间进行音量转化时能够保证一定精度的一种实现。可以理解为转化过程中保留了小数点后一位的精度。...mController.volumeChanged()方法,通过AIDL将调用到VolumeUI.java文件的VolumeController.volumeChanged()方法,最后将会调用mPanel.postVolumeChanged

3.1K10

线程的基本概念

分时系统,进程的每个线程都拥有一个时间片,时间片结束保存 CPU 及寄存器的线程上下文并交出 CPU,完成一次线程间切换。当然,当进程的 CPU 时间使用结束,所有的线程必然被阻塞。...run 方法,你也就指明了你的线程得到 CPU 之后执行指令的起点。...所以当线程启动,调用的 run 方法就会是我们自己实现实现类的 run 方法。 所以,自然会有第二种创建方式。...我们创建了 100 个线程,每个线程启动随机 sleep 一会,然后为 count 加一,按照一般的顺序执行,count 的值会是 100。...这段代码很简单,主线程和我们的 ThreadTwo 共享一个全局变量 flag,后者一直监听这个变量值的变化情况,而我们主线程修改了这个变量的值,由于内存可见性问题,主线程的修改并不会立马映射到内存

46020

浅谈 Java 并发下的乐观锁

Java 多线程编程,所谓原子操作,就是即使命令涉及多个操作,这些操作依次执行,不会被别的线程插队打断。 ? 原子操作 聊完原子操作了,我们进入正题。...Java CAS 的底层实现 Java 的 Unsafe 类 我先问大家一个问题: 什么是指针? 针对学过 C、C++ 语言的同学想必都不陌生。...CAS Java 的使用 一个比较常见的操作,使用变量 i 来为程序计数,可以对 i 自实现。 int i=0; i++; 但稍有经验的同学都知道这种写法是线程不安全的。...我们可以看到, CAS 算法是基于值来做比较的,如果当前有两个线程,一个线程将变量值从 A 改为 B ,再由 B 改回为 A ,当前线程开始执行 CAS 算法,就很容易认为值没有变化,误认为读取数据到执行...修改后的 CAS 算法执行流程如下图: ? 改正 CAS 算法 AtomicStampedReference 那如何能在 Java 顺畅的使用带版本号比较的 CAS 函数呢?

36810

程序员深夜惨遭老婆鄙视,原因竟是CAS原理太简单?| 每一张图都力求精美

调用UnSafe类的CAS方法,JVM会帮我们实现出CAS汇编指令,这是一种完全依赖于硬件的功能,通过它实现了原子操作。...在上篇讲volatile,讲到了如何使用原子整型类AtomicInteger来解决volatile的非原子性问题,保证多个线程执行num++的操作,最终执行的结果与单线程一致,输出结果为20000。...所以比较后,发现变量没被其他线程修改,可以进行替换,替换值为var5+var4=11,变量值替换后为 11,也就是自1。这行代码执行结果返回true(自成功),退出do while循环。...(10)子线程aaa继续执行,进行比较和替换,结果为true 因var5=11,主内存的变量值也等于11,所以比较后相等,可以进行替换,替换值为var5+var4,结果为12,也就是自1。...频繁出现自旋,循环时间长,开销大(因为执行的是do while,如果比较不成功一直循环,最差的情况,就是某个线程一直取到的值和预期值都不一样,这样就会无限循环) 只能保证一个共享变量的原子操作 当对一个共享变量执行操作

60451

框架篇:分布式全局唯一ID

前言 每一次HTTP请求,数据库的事务的执行,我们追踪代码执行的过程,需要一个唯一值和这些业务操作相关联,对于单机的系统,可以用数据库的自ID或者时间戳加一个本机递增值,即可实现唯一值。...但在分布式,又该如何实现唯一性的ID 分布式ID的特性 数据库自的ID Redis分布式ID Zookeeper分布式ID 全局唯一UUID的优缺点 Twitter的雪花算法生成分布式ID github...,查询比较,可以判断业务操作的时间顺序 数据库自的ID 实现简单,ID单调自,数值类型查询速度快,但是单点DB存在宕机风险,无法扛住高并发场景 CREATE TABLE FLIGHT_ORDER...ID的唯一性 当随着业务发展,服务拓展到多台的大集群,为了解决单点数据库的压力,数据库也会相应的变成一个集群,那如何保证集群下数据库ID的唯一性 每一台数据库实例都设置一个起始值和增长步长 ?...❝ 1:第一个bit位(1bit):Javalong的最高位是符号位代表正负,正数是0,负数是1,一般生成ID都为正数,所以默认为0。

67230

并发三大特性

原子性 含义 一个或多个操作,要么全部执行执行过程不被任何因素打断,要么全部不执行 Java ,对基本数据类型的变量的读取和赋值操作是原子性操作。...重要 不采取任何的原子性保障措施的自操作并不是原子性的。 如何保证原子性 通过 synchronized 关键字定义同步代码块或者同步方法保障原子性。 通过 Lock 接口保障原子性。...Java 内存模型是通过变量修改后将新值同步回主内存,变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法实现可见性的。...如何保证可见性 通过 volatile 关键字标记内存屏障保证可见性。 通过 synchronized 关键字定义同步代码块或者同步方法保障可见性。 通过 Lock 接口保障可见性。...有序性 含义 即程序执行的顺序按照代码的先后顺序执行。 JVM 存在指令重排,所以存在有序性问题。 如何保证有序性 通过 synchronized关键字 定义同步代码块或者同步方法保障可见性。

81310

JUC并发编程之JMM内存模型详解

所以java内存模型(JMM)屏蔽掉各种硬件和操作系统的内存访问差异,以实现java程序各种平台下都能达到一致的并发效果。...Java内存模型规定所有变量都存储主内存,主内存是共享内存区域,所有线程都可以访问,包括实例变量,静态变量,但是不包括局部变量和方法参数。...带着这个疑惑,将代码稍微改动一下,这次代码定义一个全局变量为count为int类型,并在A线程循环中,将变量count自操作,再来看看它的效果如何 ?...通过对前面的硬件内存架构、Java内存模型以及Java多线程的实现原理的了解,我们应该已经意识到,多线程的执行最终都会映射到硬件处理器上进行执行,但Java内存模型和硬件内存架构并不完全一致。...但Java内存模型只要求上述操作必须按顺序执行,而没有保证必须是连续执行。 结合上面的代码例子,通过八大原子操作,实现的流程 ?

53330

volatile 关键字(修饰变量)

保证可见性 禁止指令重排序优化 指令重排序优化:普通的变量仅仅会保证方法执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序和程序代码执行顺序一致 3....而访问非 volatile 变量,每个线程都会从系统内存(主内存)拷贝变量到工作内存,然后修改工作内存的变量值,操控的变量可能不同。 4....如何禁止指令重排序优化 volatile 通过设置 Java 内存屏障禁止重排序优化。...大多数处理器的实现,这个屏障是个万能屏障,兼具其它三种内存屏障的功能 volatile 做了什么 一个变量被 volatile 修饰后,JVM 会为我们做两件事: 每个 volatile 写操作前插入...只有是原子操作的 volatile 变量才是线程安全的,比如我们很常见的 变量++ 自操作,在这个过程,自包括取数,加一,保存三个过程的操作,所以自并不是原子性操作,使用 volatile 修饰的变量自操作仍然是不安全的

52521

Java面试题—基础题目

调用Object.wait方法或Thread.join方法,或者是等待java.util.concurrent库的Lock或Condition,就会出现这种情况; Timed waiting(计时等待...参考资料 曹神的文章:如何应对索引 MySQL索引背后的数据结构及算法原理 6. ArrayList是如何实现的,ArrayList和LinkedList的区别?ArrayList如何实现扩容?...初始化:真正开始执行定义的Java程序代码;初始化用于执行Java类的构造方法。类初始化的过程是不可逆的,如果中间一步出错,则无法执行下一步,参见不可逆的类初始化过程。 10....Java虚拟机运行时数据区 程序计数器(PC):Java线程私有,类似于操作系统里的PC计数器,用于指定下一条需要执行的字节码的地址; Java虚拟机栈:Java线程私有,虚拟机展描述的是Java方法执行的内存模型...:每个方法执行的时候,都会创建一个栈帧用于存储局部变量、操作数、动态链接、方法出口等信息;每个方法调用都意味着一个栈帧虚拟机栈入栈到出栈的过程; 本地方法栈:和Java虚拟机栈的作用类似,区别是该该区域为

45720

高并发编程必备基础(上)

一、前言 借用Java并发编程实践的话"编写正确的程序并不容易,而编写正常的并发程序就更难了",相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为没有进行适当同步的情况下多线程各个操作的顺序是不可预期的...Java首要的同步策略是使用Synchronized关键字,它提供了可重入的独占锁。 三、 什么是共享变量可见性问题 要谈可见性首先需要介绍下多线程处理共享变量时候的Java内存模型。 ?...image.png Java内存模型规定了所有的变量都存放在主内存,当线程使用变量时候都是把主内存里面的变量拷贝到了自己的工作内存的。...我们知道ArrayList是线程不安全的,因为他的读写方法没有同步策略,会导致脏数据和不可预期的结果,下面我们就一一讲解如何解决。...十、 乐观锁与悲观锁 10.1 悲观锁 悲观锁,指数据被外界修改持保守态度(悲观),整个数据处理过程,将数据处于锁定状态。 悲观锁的实现,往往依靠数据库提供的锁机制 。

41020

MySQL实现中位数算法

本次文章目的: MySQL并没有专门的中位数算法,而对于SQL不熟悉的人,书写中位数,只能通过Java等语言实现。...如何得到新的自ID呢?...ResidentialAreaID = 99 ORDER BY Price 注意几点: 1.SELECT,给临时变量赋值,使用 := 2.每条语句,从底层讲,都是循环查询,因此语句上直接自,...当然,上面的语句其实是2条语句,这样放到JAVA或者其他语言中执行,可能不方便,因此也可以修改成如下语句: SELECT @ID:=@ID+1 AS ID,ResidentialAreaID,CaseFrom...看上去很多,其实相较于其他方式,已经很精简了,不过还没完,我们还有很多方法可以尝试! 例如编写Mysql 自定义函数、存储过程来实现,不过这就有点偏离了。 接下来换一种方式实现

2.6K10

面试官最爱的volatile关键字

Java相关的岗位面试,很多面试官都喜欢考察面试者对Java并发的了解程度,而以volatile关键字作为一个小的切入点,往往可以一问到底,把Java内存模型(JMM),Java并发编程的一些特性都牵扯出来...在线程执行时,首先会从主存read变量值,再load到工作内存的副本,然后再传给处理器执行执行完毕后再给工作内存的副本赋值,随后工作内存再把值传回给主存,主存的值才更新。...下面就要提到你刚才问到的问题了,JMM主要就是围绕着如何在并发过程如何处理原子性、可见性和有序性这3个特征来建立的,通过解决这三个问题,可以解除缓存不一致的问题。...JMM保证了重排序不会影响到单线程的执行,但是多线程却容易出问题。...()原则:一个对象的初始化完成先行发生于它的finalize()方法的开始 第1条规则程序顺序规则是说一个线程里,所有的操作都是按顺序的,但是JMM里其实只要执行结果一样,是允许重排序的,这边的happens-before

58660
领券