
JAVA基础篇
分享交流JAVA基础原理和实现
打工人笔记
点滴积累方有为,每步思索可致远。
展开
-
JAVA基础篇-多线程之按顺序放(按顺序取执行结果)
package com.hthl.rabbit;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;...原创 2017-08-29 10:42:50 · 2349 阅读 · 0 评论 -
JAVA基础篇-线程池之invokeAll的使用
并发性(concurrency)和并行性(parallel)是两个概念,并行是指在同一时刻,有多条指令在多个处理器上同时执行;并发指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行,使得宏观上具有多个进程同时执行的效果。多线程编程优点:进程之间不能共享内存,但线程之间共享内存非常容易。系统创建线程所分配的资源相对创建进程而言,代价非常小。Java中实现线程的方式目前有三种:一:...原创 2017-08-28 18:38:17 · 7669 阅读 · 0 评论 -
JAVA基础篇-数据依赖性含义
如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列3种类型,如表3-4所示。上面3种情况,只要重排序两个操作的执行顺序,程序的执行结果就会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。这里所说的数据依赖性仅针对...原创 2017-07-05 15:17:45 · 3658 阅读 · 1 评论 -
JAVA基础篇-使用循环CAS实现原子操作
JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止,以下代码实现了一个基于CAS线程安全的计数器方法safeCount和一个非线程安全的计数器count。package chapter02;import java.util.ArrayList;import java.util.List;import j...原创 2017-06-30 09:36:12 · 811 阅读 · 0 评论 -
JAVA基础篇-原子操作的实现原理
原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。1.术语定义在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。2.处理器如何实现原子操作32位IA-32处理器使用...原创 2017-06-28 09:38:39 · 15508 阅读 · 1 评论 -
JAVA基础篇-锁的升级与对比
Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率,下文会详细分析。1.偏...原创 2017-06-26 12:22:31 · 539 阅读 · 0 评论 -
JAVA基础篇-synchronized的实现原理与应用
在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。本文详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。先来看下利用synchronized实现同步的基础:Java中的每一个对象都可以...原创 2017-06-26 10:13:03 · 470 阅读 · 0 评论 -
JAVA基础篇-volatile的定义与实现原理
Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。在了解volatile实现原理之前,我们先来看下与其实现原理相关的C...原创 2017-06-26 10:07:07 · 2512 阅读 · 0 评论 -
JAVA基础篇-线程死锁例子
锁是个非常有用的工具,运用场景非常多,因为它使用起来非常简单,而且易于理解。但同时它也会带来一些困扰,那就是可能会引起死锁,一旦产生死锁,就会造成系统功能不可用。让我们先来看一段代码,这段代码会引起死锁,使线程t1和线程t2互相等待对方释放锁。线程锁住的其实是synchronized后面的对象,当同一个对象被多个线程锁住时就会发生死锁现象。package chapter01;//死...原创 2017-06-22 18:34:01 · 834 阅读 · 0 评论 -
JAVA基础篇-多线程一定快吗
下面的代码演示串行和并发执行并累加操作的时间,请分析:下面的代码并发执行一定比串行执行快吗?package chapter01;//并发和单线程执行测试public class ConcurrencyTest { /** 执行次数 */ private static final long count=10000l; public static void main(Stri...原创 2017-06-22 12:17:17 · 1377 阅读 · 0 评论 -
JAVA基础篇-文件分片与合成实践
本文提供两种文件分片与合成的方法,分别是普通IO流的方式和使用RandomAccessFile的方式,推荐RandomAccessFile方式,接下来请看代码实现:package com.study.xxl;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.Fil...原创 2019-05-20 11:53:21 · 2442 阅读 · 0 评论 -
JAVA基础篇-IO流总结
本篇主要对Java基础中输入输出流做一个学习总结。1.Java流类图结构(两种方式展示)2.java.io包下的所有类的结构图3.流的概念流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。4.流的分类按流的方向分为:输入流和输出流按流的数据单位...原创 2019-05-16 12:07:37 · 275 阅读 · 0 评论