随笔分类 -  Thread

摘要:LongAdder 提供了原子累计值的方法。 在高并发下N多线程同时去操作一个变量会造成大量线程CAS失败然后处于自旋状态,这大大浪费了cpu资源,降低了并发性。那么既然AtomicLong性能由于过多线程同时去竞争一个变量的更新而降低的,LongAdder思路把一个变量分解为多个变量,让同样多的线 阅读全文
posted @ 2019-07-20 01:31 曲阳阳 阅读(241) 评论(0) 推荐(0)
摘要:锁的内存语义 锁的释放与获取所建立的happen-before关系 锁的释放与内存语义 锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息 volatile的内存语义 volatile读写所建立的happens-before关系 volatile读写的内存语义 2.当写一个v 阅读全文
posted @ 2019-07-20 00:03 曲阳阳 阅读(172) 评论(0) 推荐(0)
摘要:Executor 它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助 阅读全文
posted @ 2019-07-19 12:08 曲阳阳 阅读(436) 评论(0) 推荐(0)
摘要:线程池 线程池线程池概述创建一个线程池并提交线程任务线程池源码解析参数认识构造方法提交任务addWorker执行任务关闭线程池 线程池线程池概述创建一个线程池并提交线程任务线程池源码解析参数认识构造方法提交任务addWorker执行任务关闭线程池 线程池概述 什么是线程池 为什么使用线程池 线程池的 阅读全文
posted @ 2019-07-19 10:25 曲阳阳 阅读(205) 评论(0) 推荐(0)
摘要:同步容器 性能差,线程不安全 Vector (线程安全)--> ArrayList(线程不安全) Vector 直接在方法上加同步,保证线程安全,不适用并发执行,性能损耗大 arrayList ArrayList<String> s = new ArrayList<>(); Collections. 阅读全文
posted @ 2019-07-18 18:11 曲阳阳 阅读(408) 评论(0) 推荐(0)
摘要:用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。 多线程的目的不仅仅是提高程序运行的性能,但是可以充分利用CPU资源 fork() 在当前线程运行的线程池中安排一个异步执行。简单的理解就是再创建一个子任务。 join() 当任务完成的时候返回 阅读全文
posted @ 2019-07-17 15:29 曲阳阳 阅读(201) 评论(0) 推荐(0)
摘要:FutureTask FutureTask可用于异步获取执行结果或取消执行任务的场景。通过传入Runnable或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过FutureTask的get方法异步获取执行结果. Callable() Futu 阅读全文
posted @ 2019-07-17 13:58 曲阳阳 阅读(552) 评论(0) 推荐(0)
摘要:CountDownLatch CountDownLatch 允许一个或多个线程等待其他线程完成操作。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后 阅读全文
posted @ 2019-07-17 07:24 曲阳阳 阅读(178) 评论(0) 推荐(0)
摘要:该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供 Thread 阅读全文
posted @ 2019-07-15 16:36 曲阳阳 阅读(165) 评论(0) 推荐(0)
摘要:Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式 condition对象是依赖于lock对象的,意思就是说condition对象需要通过lock对象进行创建出来(调用Lock对象的newCondition()方法) 三个线程依次打印abc Condit 阅读全文
posted @ 2019-07-15 11:31 曲阳阳 阅读(357) 评论(0) 推荐(0)
摘要:主要是三个方法wait(); notify(); notifyAll() wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。 wait方法释放 阅读全文
posted @ 2019-07-14 14:35 曲阳阳 阅读(133) 评论(0) 推荐(0)
摘要:排他锁与共享锁 读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。 读-读能共存,读-写不能共存,写-写不能共存 读写锁的实现 Main 执行如下 Thread-0写操作正在执行Thread-0写操作执行完毕Thread 阅读全文
posted @ 2019-07-11 19:05 曲阳阳 阅读(148) 评论(0) 推荐(0)
摘要:AbstractQueueSynchronized 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架。该同步器(以下简称同步器)利用了一个int来表示状态,期望它能够成为实现大部分同步需求的基础。使用的方法是继承,子类通过继承同步器并需要实现它的方法来管理其状态,管理的方式就 阅读全文
posted @ 2019-07-11 12:38 曲阳阳 阅读(239) 评论(0) 推荐(0)
摘要:Lock接口中有lockInterruptibly方法(线程中断),tryLock方法(获取锁成功返回成功,获取锁失败返回失败),还有就是锁的公平性问题,还有就是提供读写性能的ReadWriteLock等等。 Lock需要显示地获取和释放锁,繁琐,能让代码更加灵活 Synchronized不需要显示 阅读全文
posted @ 2019-02-14 09:42 曲阳阳 阅读(486) 评论(0) 推荐(0)
摘要:volatileche称为轻量级锁,被volatile修饰的变量,在线程之间是可见的。可见:一个线程修改了这个变量的值,在另一个线程中能够读到这个修改后的值synchronized除了线程之间互斥,还有一个非常大的作用,就是保证可见性 10最终结果为:10 volatile的底层是怎样实现的? 我们 阅读全文
posted @ 2019-02-13 07:03 曲阳阳 阅读(574) 评论(0) 推荐(0)
摘要:重入锁 重入锁 能够让线程进行重入的锁叫作重入锁锁重入 让线程进行重入的过程叫作锁的重入 锁是当前类的实例,当进入a方法的时候,线程必须先拿到当前类的实例(锁),这个时候,a的方法内同时调用了b方法,b方法也是用synchronized来修饰的,所以b方法也需要线程获取锁才能让线程进来 进入a方法的 阅读全文
posted @ 2019-02-12 21:26 曲阳阳 阅读(363) 评论(0) 推荐(0)
摘要:饿汉式 没有线程安全问题 懒汉式 双重检验加锁解决线程安全问题 阅读全文
posted @ 2019-02-12 19:03 曲阳阳 阅读(184) 评论(0) 推荐(0)
摘要:线程安全性问题 多线程环境下多个线程共享一个资源对资源进行非原子性操作 线程所带来的风险 线程安全性问题活跃性问题(死锁,饥饿,活锁) 性能问题 首先我们知道类的实例化对象是在堆内存中的,堆属于线程所共享的区域,程序计数器是线程独享的区域,value变量属于多个线程共享的区域。 0 -> 第一个线程 阅读全文
posted @ 2019-02-11 20:49 曲阳阳 阅读(142) 评论(0) 推荐(0)
摘要:新建spring boot工程,pom 中引入spring-context依赖 //Config.java @Configuration@ComponentScan("com.roocon.thread.t1")@EnableAsyncpublic class Config { } 阅读全文
posted @ 2019-02-10 18:39 曲阳阳 阅读(126) 评论(0) 推荐(0)