自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Dave的博客

数据搬运工,厚积薄发

  • 博客(130)
  • 资源 (1)
  • 收藏
  • 关注

原创 Spring-Quartz内部组件架构+简易demo

Quartz对任务调度领域进行了高度抽象,抽象出了调度器,触发器,任务。简单介绍下几个组件的意思,具体起什么作用Job:是一个接口,只有一个excute(),定义需要执行的任务,运行时的信息保存在JobDataMap中。Trigger:描述触发job执行时间的触发规则。主要有SimpleTrigger和CronTrigger。JobDetail:保存了Job的名称,描述,关联监听器等信息...

2019-02-19 13:29:19 300

原创 JVM扫盲-运行时数据区域

程序计数器可以把它看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等基础功能都需要依赖这个计数器来完成。 程序计数器是每个线程私有的。如果线程正在执行一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果线程正在执行的是Native方法,这个计数器值则为...

2018-08-01 12:44:37 250

原创 Java并发-Executor框架

Executor框架的两级调度模型 Executor框架主要由3部分组成 1.任务:包括被执行任务需要实现的接口:Runnable接口或Callable接口 2.任务的执行:包括执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。(ThreadPoolExecutor和ScheduledThreadPoolExecutor) 3.异步计算...

2018-07-31 11:01:00 360

原创 Java并发-线程池

线程池的好处1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高相应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。线程池的处理流程1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创...

2018-07-30 16:43:17 200

原创 Java并发-Semaphore

Semaphore用来控制同时访问特定资源的线程数量,它通过协调各个线程来保证合理的使用公共资源。 比如马路上要限制流量,只允许同时有100辆车在这条路上行驶,其他的都在路口等待,所以前100辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,如果100辆中有5辆已经离开马路,那么后面就允许有5辆车驶入马路Semaphore内部包含公平锁和非公平锁,继承内部类Sync,其中Sync继承...

2018-07-30 14:22:51 162

原创 Java并发-CyclicBarrier

CyclicBarrier它允许一组线程互相等待,知道到达某个公共屏障点。barrier在释放等待线程后可以重用。 CyclicBarrier的内部是使用重入锁ReentrantLock和Condition。 public CyclicBarrier(int parties) { this(parties, null); } public Cy...

2018-07-30 12:00:18 179

原创 Java并发-CountDownLatch

CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数接受一个int类型的参数作为计数器。 当我们调用COuntDownLatch的countDown()时,N就会减1,CountDownLatch的await()会阻塞当前线程,知道N变成0。CountDownLatch的实现分析CountDow...

2018-07-29 11:40:25 183

原创 Java并发-HashMap在jdk1.7多线程中的问题

死循环HashMap扩容过程void resize(int newCapacity) { Entry[] oldTable = table; int oldCapacity = oldTable.length; if (oldCapacity == MAXIMUM_CAPACITY) { threshold = Integer.MAX_VALUE;...

2018-07-28 00:19:10 803

原创 Java并发-入队列/出队列

入队列入队列就是将入对节点添加到队列的尾部 举个例子: ·添加元素1。队列更新head节点的next节点为元素1节点。又因为tail节点默认情况下等于head节点,所以它们的next节点都指向元素1节点。 ·添加元素2。队列首先设置元素1节点的next节点为元素2节点,然后更新tail节点指向元素2节点。 ·添加元素3。队列首先设置tail节点的next节点为元素3节点。 ·添加元素...

2018-07-27 18:35:25 1725

原创 Java并发-Condition的实现分析

Condition基本用法 Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void conditionWait() { lock.lock(); try { condition.await()...

2018-07-27 15:09:09 200

原创 Java并发-ReentrantReadWriteLock锁降级/锁升级

读写锁读写锁维护了一对锁,一个读锁和一个写锁。 在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。锁升级/锁降级同一个线程中,在没有释放读锁的情况下,就去申请写锁,这属于锁升级,ReentrantReadWriteLock是不支持的。public class ReadWriteTest { public static void ...

2018-07-24 17:24:53 3645

原创 Java并发-类锁与对象锁

第一种比较:对象锁与synchronized方法public class TestSynchronized { public void test1() { synchronized (this) { int i = 5; while (i-- > 0) { System.out.pr...

2018-07-24 15:25:15 386

原创 Java并发-AQS如何完成线程同步

同步队列AQS依赖内部的同步队列(FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器将会将当前线程以及等待状态等信息构造成为一个节点(NODE)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。 独占式同步状态获取与释放public final void acquire(int arg) { ...

2018-07-23 17:53:58 567

原创 为什么equals()与hashCode(),这两个方法需要一起覆盖?

在哈希表中,当我们向其添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则...

2018-07-12 10:35:16 821

原创 Java并发-等待/通知

wait(),notify()及notifyAll()注意细节1.使用wait(),notify()和notifyAll()时需要先对调用对象加锁。 2.调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列。 3.notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAl...

2018-07-11 18:31:57 269

原创 Java并发-对象监视器

对于同步块的实现使用了monitorenter和monitorexit指令,而同步方法则是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的。 无论采用哪种方式,其本质是对一个对象的监视器进行获取,而对这个获取过程是排他的,也就是说统一时刻是能有一个线程获得到由synchronized所保护对象的监视器。任意线程对Object的访问,首先要先获得Object的监视器。如果获取失败...

2018-07-11 14:19:02 7585

原创 Java并发-Thread.intrrupted()与isInterrupted()与interrupt()

中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。其他线程通过调用该线程的interrupt()方法对其进行中断操作。 线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。 有一点需要注意:如果线程已经处于终结状态,即使该线程被中断过,在调用该线程对象的i...

2018-07-11 12:02:42 652

原创 Java并发-线程的状态

线程的状态线程状态变迁 Java将操作系统中的运行和就绪两个状态合并称为运行状态。

2018-07-11 10:42:11 146

原创 Java并发-类的初始化

在首次发生下列任意一种情况时,一个类或接口类型T将被立即初始化。 1)T时一个类,而且一个T类型的实例被创建。 2)T是一个类,且T中声明的一个静态方法被调用。 3)T中声明的一个静态字段被赋值。 4)T中方声明的一个静态字段被使用,而且这个字段不是一个常量字段。 5)T是一个顶级类,而且一个断言语句嵌套在T内部被执行。...

2018-07-10 20:23:55 333

原创 Java并发-final

final域的重排序规则1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 假设一个线程A执行writer()方法,随后另一个线程B执行reader()方法。写final域的重排序规则写final域的重排序规...

2018-07-10 10:47:21 401

原创 Java并发-Concurrent包的实现

Concurrent首先,声明共享变量为volatile。 然后,使用CAS的原子条件更新来实现线程之间的同步。 同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信...

2018-07-09 19:57:52 365

原创 Java并发-公平锁与非公平锁

1.公平锁和非公平锁释放时,最后都要写一个volatile变量的state。 protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThre...

2018-07-01 17:47:57 191

原创 Java并发-volatile

volatile自身特性可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:对任意单个volatile变量的读/写具有原子性,单类似于volatile++这种复合操作不具有原子性 等同于 volatile写和锁的释放有相同的内存语义;volatile读和锁的获取有相同的内存语义volatile写内存语义当写一个...

2018-07-01 16:07:01 180

原创 Java并发-顺序一致性模型

顺序一致性模型顺序一致性内存模型有两大特性 1)一个线程中的所有操作必须按照程序的顺序来执行。 2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。 在概念上,顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程,同时每一个线程必须按照程序的顺序来执行内存读/写操作。...

2018-06-24 19:37:36 1807

原创 Java并发-happens-before,重排序

happens-before规则程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任一后续操作 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁 volatile变量规则:对一个volatile域的写,happens-before于任一后续对这个volatile域的读 传递性:如果A happens-before B,且B happ...

2018-06-24 15:44:40 325

原创 Java并发-内存屏障

现代的处理器使用写缓冲区临时保存内存写入的数据。写缓冲区可以保证指令流水线持续运行,他可以避免由于处理器停顿下来等待内存写入数据而产生的延迟。同时,通过以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一个内存地址的多次写,减少对内存总线的占用。每个处理去上的写缓冲区,仅仅对它所在的处理器可见。这个特性会对内存操作的执行顺序产生重要的影响:处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的...

2018-06-23 16:35:15 346

原创 Java并发-Java内存模型

线程之间的通信与同步通信是指线程之间以何种机制来交换信息,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。同步是指程序中用于控制不同线程间操作发生相对顺序的机制。 在共享内存并发模型里,同步时显式进行的。程...

2018-06-23 14:50:03 247

原创 Java并发-synchronized与原子操作的实现原理

synchronizedJava中的每一个对象都可以作为锁 1.对于普通同步方法,锁是当前实例对象 2.对于静态同步方法,锁是当前类的Class对象 3.对于同步方法块,锁是Synchronized括号里配置的对象 当一个线程驶入访问同步块时,它首先必须得到锁。退出或者抛出异常时必须释放锁。实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但实现细节不一...

2018-06-23 14:22:37 1923

转载 JavaWeb-POST与GET

POST与GET区别GET在浏览器回退时是无害的,而POST会再次提交请求。GET产生的URL地址可以被Bookmark,而POST不可以。GET请求会被浏览器主动cache,而POST不会,除非手动设置。GET请求只能进行url编码,而POST支持多种编码方式。GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。GET请求在URL中传送的参数是有长...

2018-06-21 19:19:20 329

原创 Java并发-活跃性问题

饥饿当线程由于无法访问它所需要的资源而不能继续执行时,就发生了“饥饿“。 引发饥饿的最常见资源就是CPU时钟周期。(无限循环,或者无限制地等待某个资源) Thread API中定义的线程优先级只是作为线程调度的参考,定义了10个优先级,JVM根据需要将它们映射到操作系统的调度优先级。这种映射是与特定平台相关的,可能某个操作系统中两个不同的Java优先级可能被映射到同一个优先级。 经常可能...

2018-06-19 20:54:32 567

原创 Java并发-synchronized与ReentrantLock之间的选择

可重入ReentrantLock和synchronized其实都是可重入的锁。两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。实现synchronized是依赖JVM实现的,而ReentrantLock是JDK实现的性能synchronized优化以前,性能比ReentrantLock差很多。自从Synchronized引入了...

2018-06-19 19:50:50 484

原创 Java并发-ThreadLocal

ThreadLocal与线程同步机制的区别线程同步机制是共享同一个变量 ThreadLocal是为每个线程创建一个变量副本ThreadLocalThreadLocal内部还有一个静态内部类ThreadLocalMap,该内部类才是实现线程隔离机制的关键,get()、set()、remove()都是基于该内部类操作。ThreadLocalMap提供了一种用键值对方式存储每一个线程的...

2018-06-17 20:22:31 149

原创 MAC 快速打开指定文件夹

1.在终端 cd到需要打开的路径 2.open .over~

2018-05-16 16:18:04 6278

原创 Mac添加环境变量及Homebrew的安装

HomebrewHomebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。Homebrew的安装/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst...

2018-04-30 23:35:32 9567

原创 mac QQ邮箱无法验证用户名和密码

第一步:打开自己的QQ邮箱,点击设置 第二步:选择账户 第三步:开启POP3/SMTP与IMAP/SMTP服务,之后点击生成授权码 第四步:点击发送,会有生成授权码 第五步:复制这串授权码 ...

2018-04-23 23:38:26 23062 1

原创 MAC浏览器刷新/强制刷新

MAC浏览器刷新 Command+r MAC浏览器强制刷新 Command+Shift+r

2018-04-22 11:07:35 14664

原创 Git简单常用操作

git checkout1、本地从当前所在分支上创建一个新分支: git checkout -b 新分支名 2、拉取远程某个分支到本地: git checkout -b 本地分支名 origin/远程分支名git push非master分支都需要加上origin git push origin 当前分支名 强制推送 git push -u origin maste...

2018-04-12 22:53:14 174

原创 Redis

什么是redis?(Remote Dictionary Server(远程数据服务))非阻塞多路复用: 又被称为事件驱动,reactor模式 下面举一个例子,模拟一个tcp服务器处理30个客户socket。 假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到...

2018-04-09 18:16:38 387

原创 Intellij IDEA注册码 激活(可用)

进入ide主页面,help-register-license server,然后输入 http://idea.iteblog.com/key.php(注意:php要小写)即可~如下图,不行的话就试试这个链接:http://xdouble.cn:8888/ ...

2018-04-07 00:35:44 1324 1

原创 线程数设多少合适??

线程数设多少合适??提问:工作线程数是不是设置的越大越好? 回答:肯定不是的 1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义 2)线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低提问:如果CPU是单核,设置多线程有意义么,能提高并发性能么? 回答:即使是单核,使用多线程也是有意义的 1)多线程编码可以让我们的服务/代码...

2018-04-05 21:32:43 10594

redis可视化工具

redis windows mac linux可视化工具 Redis Desktop Manager 顾名思义是针对Redis 数据库开发的桌面管理芽人,它是快速,简单的Redis数据库图形化界面管理器,支持Windows、Mac和Linux平台。

2018-04-07

空空如也

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

TA关注的人

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