- 博客(21)
- 资源 (1)
- 收藏
- 关注
原创 Java并发-Executor框架
Executor框架的两级调度模型 Executor框架主要由3部分组成 1.任务:包括被执行任务需要实现的接口:Runnable接口或Callable接口 2.任务的执行:包括执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。(ThreadPoolExecutor和ScheduledThreadPoolExecutor) 3.异步计算...
2018-07-31 11:01:00 398
原创 Java并发-线程池
线程池的好处1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高相应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。线程池的处理流程1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创...
2018-07-30 16:43:17 209
原创 Java并发-Semaphore
Semaphore用来控制同时访问特定资源的线程数量,它通过协调各个线程来保证合理的使用公共资源。 比如马路上要限制流量,只允许同时有100辆车在这条路上行驶,其他的都在路口等待,所以前100辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,如果100辆中有5辆已经离开马路,那么后面就允许有5辆车驶入马路Semaphore内部包含公平锁和非公平锁,继承内部类Sync,其中Sync继承...
2018-07-30 14:22:51 191
原创 Java并发-CyclicBarrier
CyclicBarrier它允许一组线程互相等待,知道到达某个公共屏障点。barrier在释放等待线程后可以重用。 CyclicBarrier的内部是使用重入锁ReentrantLock和Condition。 public CyclicBarrier(int parties) { this(parties, null); } public Cy...
2018-07-30 12:00:18 206
原创 Java并发-CountDownLatch
CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数接受一个int类型的参数作为计数器。 当我们调用COuntDownLatch的countDown()时,N就会减1,CountDownLatch的await()会阻塞当前线程,知道N变成0。CountDownLatch的实现分析CountDow...
2018-07-29 11:40:25 194
原创 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 809
原创 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 1765
原创 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 210
原创 Java并发-ReentrantReadWriteLock锁降级/锁升级
读写锁读写锁维护了一对锁,一个读锁和一个写锁。 在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。锁升级/锁降级同一个线程中,在没有释放读锁的情况下,就去申请写锁,这属于锁升级,ReentrantReadWriteLock是不支持的。public class ReadWriteTest { public static void ...
2018-07-24 17:24:53 3722
原创 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 396
原创 Java并发-AQS如何完成线程同步
同步队列AQS依赖内部的同步队列(FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器将会将当前线程以及等待状态等信息构造成为一个节点(NODE)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。 独占式同步状态获取与释放public final void acquire(int arg) { ...
2018-07-23 17:53:58 580
原创 为什么equals()与hashCode(),这两个方法需要一起覆盖?
在哈希表中,当我们向其添加对象object时,首先调用hashCode()方法计算object的哈希码,通过哈希码可以直接定位object在哈希表中的位置(一般是哈希码对哈希表大小取余)。如果该位置没有对象,可以直接将object插入该位置;如果该位置有对象(可能有多个,通过链表实现),则调用equals()方法比较这些对象与object是否相等,如果相等,则不需要保存object;如果不相等,则...
2018-07-12 10:35:16 856
原创 Java并发-等待/通知
wait(),notify()及notifyAll()注意细节1.使用wait(),notify()和notifyAll()时需要先对调用对象加锁。 2.调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列。 3.notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAl...
2018-07-11 18:31:57 296
原创 Java并发-对象监视器
对于同步块的实现使用了monitorenter和monitorexit指令,而同步方法则是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的。 无论采用哪种方式,其本质是对一个对象的监视器进行获取,而对这个获取过程是排他的,也就是说统一时刻是能有一个线程获得到由synchronized所保护对象的监视器。任意线程对Object的访问,首先要先获得Object的监视器。如果获取失败...
2018-07-11 14:19:02 7603
原创 Java并发-Thread.intrrupted()与isInterrupted()与interrupt()
中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。其他线程通过调用该线程的interrupt()方法对其进行中断操作。 线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。 有一点需要注意:如果线程已经处于终结状态,即使该线程被中断过,在调用该线程对象的i...
2018-07-11 12:02:42 683
原创 Java并发-类的初始化
在首次发生下列任意一种情况时,一个类或接口类型T将被立即初始化。 1)T时一个类,而且一个T类型的实例被创建。 2)T是一个类,且T中声明的一个静态方法被调用。 3)T中声明的一个静态字段被赋值。 4)T中方声明的一个静态字段被使用,而且这个字段不是一个常量字段。 5)T是一个顶级类,而且一个断言语句嵌套在T内部被执行。...
2018-07-10 20:23:55 341
原创 Java并发-final
final域的重排序规则1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 假设一个线程A执行writer()方法,随后另一个线程B执行reader()方法。写final域的重排序规则写final域的重排序规...
2018-07-10 10:47:21 438
原创 Java并发-Concurrent包的实现
Concurrent首先,声明共享变量为volatile。 然后,使用CAS的原子条件更新来实现线程之间的同步。 同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信...
2018-07-09 19:57:52 386
原创 Java并发-公平锁与非公平锁
1.公平锁和非公平锁释放时,最后都要写一个volatile变量的state。 protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThre...
2018-07-01 17:47:57 206
原创 Java并发-volatile
volatile自身特性可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:对任意单个volatile变量的读/写具有原子性,单类似于volatile++这种复合操作不具有原子性 等同于 volatile写和锁的释放有相同的内存语义;volatile读和锁的获取有相同的内存语义volatile写内存语义当写一个...
2018-07-01 16:07:01 216
redis可视化工具
2018-04-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人