自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(343)
  • 资源 (3)
  • 收藏
  • 关注

原创 LockSupport示例

1. 介绍LockSupport是一个非常方便实用的线程阻塞工具,它可以在线程内任意位置阻塞线程。和Thread.suspend()相比,它弥补了由于resume()发生在前,导致线程无法继续执行的情况。和Object.wait()相比,它不需要先获得某个对象的锁,也不会抛出InterruptedException异常。2. 主要方法都是静态方法public static void par...

2020-02-06 23:01:29 250

原创 LockSupport

​ 当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。​ 在Java 6中,LockSupport增加了park(Object blocker)、parkNanos(Object blocker,long nanos)...

2020-02-06 22:53:04 136

原创 独占式超时获取同步状态

​ 通过调用同步器的doAcquireNanos(int arg,long nanosTimeout)方法可以超时获取同步状态,即在指定的时间段内获取同步状态,如果获取到同步状态则返回true,否则,返回false。超时获取同步状态过程可以被视作响应中断获取同步状态过程的“增强版”,doAcquireNanos(int arg,long nanosTimeout)方法在支持响应中断的基础上,增加了...

2020-02-06 22:28:24 260

原创 共享式同步状态获取与释放

共享式获取与独占式获取最主要的区别在于同一时刻能否有多个线程同时获取到同步状态public final void acquireShared(int arg) { if (tryAcquireShared(arg) < 0) doAcquireShared(arg);}​ 在acquireShared(int arg)方法中,同步器调用tryAcquireSh...

2020-02-06 22:24:00 141

原创 独占式同步状态获取与释放

​ 通过调用同步器的acquire(int arg)方法可以获取同步状态,该方法对中断不敏感public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfI...

2020-02-06 22:15:00 244

原创 AQS之同步队列

同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态设置尾节点​​ 同步队列遵循FIFO,首节点是获取同步状态成功的节点,首节点的线程在释放同步状态时,将会唤醒后继节点,而后...

2020-02-06 21:47:21 863

原创 AQS应用方式

​ 同步器的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法将会调用使用者重写的方法。重写同步器指定的方法时,需要使用同步器提供的如下3个方法来访问或修改同步状态。getState():获取当前同步状态。setState(int newState):设置当前同步状态。compar...

2020-02-06 21:37:10 259

原创 AQS简介

​ 队列同步器AbstractQueuedSynchronizer(以下简称同步器),是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者(Doug Lea)期望它能够成为实现大部分同步需求的基础。​​ 同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方法的实现过程...

2020-02-06 21:34:50 129

原创 ReadWriteLock

1. 介绍ReadWriteLock是jdk5中提供的读写分离锁,读写分离锁可以有效的帮助减少锁竞争,以提升系统性能。读-读 不互斥读-写 互斥,写阻塞读,读也阻塞写写-写 互斥维护了一对锁 - 读锁与写锁公平性重入性锁降级 – 写锁可降级为读锁不支持锁升级2. 设计将变量切分成了两部分,高16位标识读,低16位标识写。...

2020-02-06 21:09:20 127

原创 Condition实现分析

​ ConditionObject是同步器AbstractQueuedSynchronizer的内部类,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类也较为合理。每个Condition对象都包含着一个队列(以下称为等待队列),该队列是Condition对象实现等待/通知功能的关键。​1. 等待队列​ 等待队列是一个FIFO的队列,在队列中的每个节点都包含了一个线程...

2020-02-06 20:56:07 143

原创 ThreadLocal中的WeakReference

​ Thread对象有一个变量名为threadLocals的ThreadLocalMap对象,里面定义了一个Entry数组,Entry对象弱引用了ThreadLocal。​private void set(ThreadLocal<?> key, Object value) { // We don't use a fast path as with get(...

2020-02-06 20:48:47 623

原创 双重检查几种方案

​ 有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。​ 在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时,程序员可能会采用延迟初始化。synchronized将导致性能开销public class SafeLazyInitialization { private...

2020-02-06 20:38:42 763

原创 锁的升级

Java SE 1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在Java SE 1.6中,锁一共有4种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。目的是为了提高获得锁和释放锁的效率1. 偏向锁​ HotSpot 的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同一线程多次获得,为...

2020-02-06 20:37:06 115

原创 volatile的内存语义

volatile的特征​ 理解volatile特征的一个好的办法是把volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写做了同步。锁的happens-before规则保证释放锁和获取锁两个线程之间的内存可见性,这意味着对一个volatile变量的读总能看到任意线程对这个volatile变量最后的写入。​ 锁的内存语义决定了临界区代码的执行具有原子性,如果是多个volatile操...

2020-02-06 20:33:07 194

原创 Java如何实现原子操作

在Java中可以通过锁和循环CAS的方式来实现原子操作。(1)使用循环CAS实现原子操作​ JVM中的CAS操作正是利用了处理器提供的CMPXCHG指令实现的。自旋CAS实现的基本思路就是循环进行CAS操作直到成功为止。(2)使用锁机制实现原子操作​ 锁机制保证了只有获得锁的线程才能够操作锁定的内存区域。JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM...

2020-02-06 20:31:10 908

原创 原子操作实现原理

​ 原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。如何实现原子操作(1)使用总线锁保证原子性​ 总线锁就是使用处理器提供的一个LOCK#信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存。(2)使用缓存锁保证原子性​ 在同一时刻,我们只需保证对某个...

2020-02-06 20:28:14 264

原创 重排序

在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。重排序分3种类型。1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。2)指令级并行的重排。现代处理器采用了指令级并行技术(Instruction-Level Parallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。3)内存系统的...

2020-02-06 20:23:27 338

原创 Java内存模型的概念

1. 并发编程模型的两个关键问题​ 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)​ 通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须...

2020-02-06 20:21:48 114 1

原创 09Condition

Condition是与重入锁相关联的,通过Lock接口的Condition newCondition()方法生成一个与当前重入锁绑定的Condition实例。利用Condition对象,我们就可以让线程在合适的时间等待,或者在某一特定的时刻得到通知,继续执行。1. Condition接口提供的方法void await() throws InterruptedException;void a...

2019-12-04 23:14:35 132

原创 08ReentrantLock

重入锁,手动加锁和释放锁,退出临界区时必须手动释放,否则其它线程无法访问资源了。主要有一下几个特性:1. 可重入同一线程可以多次获得锁,但是在释放锁时,也要释放相同的次数,如果释放次数多,会得到一个IllegalMonitorStateException异常,如果释放次数少,相当于还持有锁。public class Test01 { public static class Loc...

2019-12-04 23:13:41 126

原创 07volatile的定义与实现原理

只能保证有序性和可见性,不能保证原子性实时内容请关注微信公众号,公众号与博客同时更新:程序员星星

2019-12-02 23:37:14 160

原创 06synchronized

synchronized的作用是实现线程间同步,它的工作是对同步代码块加锁,使得每一次只能有一个线程进入同步块,从而保证线程间安全性。synchronized有三种用法:指定加锁对象:对给定的对象加锁,进入同步代码块前要获得给定对象的锁。直接作用于实例方法:相当于对当前实例加锁,进入同步代码块前要获得当前实例的锁。直接作用于静态方法:相当于对当前类加锁,进入同步代码块前要获得当前类的锁...

2019-12-02 23:35:55 119

原创 05Thread类方法解析

Thread类方法解析介绍class Thread implements Runnable,Thread类继承Runnable,重写了run方法1. 构造方法Thread(Runnable target)接收一个Runnable类型的对象,赋值给Thread类属性private Runnable target;2. start()/run()start()是开启一个线程执行run()方...

2019-11-28 23:57:42 223

原创 04创建线程的几种方式

创建线程的几种方式1. 继承Threadpublic class Test01Thread { @Test public void test02() throws Exception{ System.out.println("主线程开始..."); ThreadDemo01 demo01 = new ThreadDemo01();// ...

2019-11-28 23:56:36 132

原创 03happen-before原则

程序顺序性原则:一个线程内保证语义串行性volatile原则:volatile变量的写,先发生于读,这保证了volatile变量的可见性锁规则:解锁(unlock)必然发生于随后的加锁(lock)前传递性:A先于B,B先于C,那么A必然先于C线程start()方法先于它的每一个动作线程的所有操作先于线程的终结(Thread.join())线程的中断(interrupt())先于被中断...

2019-11-28 23:55:13 161

原创 00进程与线程

进程(process):是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。线程(thread): 是程序执行的最小单位,线程的状态:public enum State{ NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED}NEW表示刚刚创建的线程,这种线程...

2019-11-27 23:17:42 128

原创 02java内存模型JMM

java内存模型JMM线程安全的几个概念1. 原子性(atomicity)​ 一个操作,不可分割,要么完成,要么失败。比如:int i = 0是原子性操作,而i=i+1不是原子性操作,因为需要先计算i+1,然后再赋值给i,如果多个线程同时操作,最终i的值是不确定的。2. 可见性(visibility)​ 多线程操作共享数据时,每个线程会把值读入自己的线程内存中,如果有线程修改了值,也可能...

2019-11-27 22:20:40 111

原创 01线程的基本概念

1. 同步(synchronize)同步可以理解为:程序按照代码的顺序从头执行到尾,必须等待执行完这行代码才能执行下面的代码。2. 异步(asynchronize)异步可以理解为:程序在执行过程中开启了多个线程,不必非要等待这行代码执行完才可以执行下一行代码,不同线程的代码是可以同时执行的。3. 并发(concurrency)多个任务看上去同时执行,其实是cpu分配一段时间给这个线程,...

2019-11-27 21:56:08 120

原创 21$emit与$on

emit与emit与emit与on$on $emit应用场景子组件中触发在父组件中定义的方法<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ...

2019-05-05 23:02:39 1106

原创 Timer定时器

Timer定时器1.介绍java.util.Timer可以设置一个后台线程,有计划的执行一次或者重复的按规律执行。每一个Timer是一个后台线程,按顺序执行所有的timer的任务。所以Timer不要执行耗时的操作,否则会造成任务堆积。Timer类是线程安全的多线程任务调度,请使用:java.util.concurrent.ScheduledThreadPoolExecutor,可以完全取代...

2019-03-03 11:34:58 634

原创 TimerTask定时任务源码解析

TimerTask定时任务1. 介绍java.util.TimerTask是一个被Timer类执行的任务。继承Runnable接口2. 类变量有下面四种状态: int state = VIRGIN; static final int VIRGIN = 0; static final int SCHEDULED = 1; static final i...

2019-03-03 11:33:02 365

原创 插入排序

* 插入排序 * 每次取出一个新的元素,插入到已经有序的数组中,并保持有序 * 例如 6 3 5 9 1 * 第一个元素为6,可以认为6为已经有序的元素,第一个元素就不用取了 * 取第二个元素3,排序后 * 3 6 5 9 1 * 取第三个元素5,排序后 * 3 5 6 9 1 * 取第四个元素9,排序后 * 3 5 6 9 1 * 取第五个元素1,排序后 * 1 3 5 ...

2019-03-02 21:35:40 202

原创 选择排序

选择排序,这个比较简单:每次比较出最小的,和第一个元素交换和第二个元素交换.,…时间复杂度O(n^2),空间复杂度O(1) public void selectSort() { int[] arr = {1, 2, 0, 9, 3, 65, 8, 9, 0, 3, 1, 8, 6, 4, 9}; for (int i = 0; i &lt; arr.l...

2019-03-02 19:07:45 150

原创 java.util.ArrayList源码解析

ArrayList1. 介绍(基于jdk11)size、isEmpty、get、set、iterator、listIterator 常数时间add O(n)其他的操作也在一个线性时间2. 属性2.1 DEFAULT_CAPACITY默认容量10 private static final int DEFAULT_CAPACITY = 10;2.2 EMPTY_ELE...

2019-03-02 16:57:30 4438

原创 hashCode与equals使用场景?什么时候需要重写

概念:这里有一个约定:hashCode相等,对象不一定相等,对象相等,hashCode一定相等。为什么需要hashCode?1、 在map等集合中,通过hashCode可以很快的找到元素的位置2、比较两个对象是否相等时,先通过hashCode比较,这样速度比较快,如果不相等直接返回false为什么要重载equal方法?Object对象默认比较的是两个对象的内存地址是否一样,正常...

2019-02-28 08:48:20 3442 2

原创 java.lang.Iterable源码解析

Iterable介绍迭代对象接口,继承这个接口,允许一个对象用for-each循环。Collection接口继承了Iterable,子类可以通过实现此类,返回一个迭代器对象。因为迭代器里面有迭代指针,所以可以通过此接口每次返回一个新迭代器对象,这样多次调用迭代器不会造成迭代位置不可控问题。所以list、set集合对象没有直接继承Iterator类iterable Iterator&lt;T...

2019-02-26 21:08:02 714

原创 Java线程池02之ThreadPoolExecutor代码实战

请先看第一篇文章基本概念Java线程池01之ThreadPoolExecutor1. 类继承关系ExecutorExecutorServiceAbstractExecutorServiceScheduledExecutorServiceThreadPoolExecutorForkJoinPoolScheduledThreadPoolExecutor2. java代码2.1 基本使用2个...

2019-02-24 11:09:58 1004

原创 Java线程池01之ThreadPoolExecutor

1. 介绍用来创建线程池2. 参数说明参数说明corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime超过corePoolSize,allowCoreThreadTimeOut(true)也可以设置核心线程数的超时时间TimeUnitkeepAliveTime时间单位workQueue阻塞任务队...

2019-02-23 09:41:18 191

原创 时间复杂度

时间复杂度1. 概念用来表示一个算法的理论上的耗时时间2. 时间频度一个算法中,语句执行的次数,被称为时间频度T(n)3.时间复杂度存在某个辅助函数f(n),当n-&amp;gt;∞时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数,记做T(n)=O(f(n)),则称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。用大O来表示时间复杂度4. 计算方法...

2019-01-31 22:59:43 2674 1

原创 java.util.AbstractList源码解析

AbstractList1. 介绍AbstractList实现了List的一个骨骼级的实现,如果要实现不可修改的list,程序需要去扩展这个类,实现get和size方法;如果要实现可修改的list,必须额外实现set方法,如果集合的大小也可以改变,还需要实现add和remove方法。iterator和list iterator已经在这个类实现好了。AbstractCollectionAbst...

2018-12-29 15:01:21 374

springcloud jar包转war包 demo

eureka,zuul,springclod jar转 war 自己做的示例,放到tomcat中运行,博客地址 http://blog.csdn.net/u012326462/article/details/79055652

2018-01-14

JSP页面的基本结构——求圆面积周长预习报告

JSP页面的基本结构——求圆面积周长预习报告,哈哈哈哈,欢迎大家下载,预习报告。

2015-12-28

JSP页面的基本结构——求圆面积周长

实验报告jsp,求院的周长和面积

2015-12-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除