![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA线程
文章平均质量分 56
qq_29842929
这个作者很懒,什么都没留下…
展开
-
java线程 CountDownLatch
CountDownLatch被用来同步一个或多个任务,强制它们等待由其他任务执行的一组操作完成。CountDownLatch的方法:1.构造方法中有初始值表示需要等待的事件的数量2.await()方法,被等待全部时间中介的线程调用3.countDown()方法,事件在结束执行后调用 当创建 CountDownLatch 对象时,对象使用构造函数的参数来初始化内部计数器。原创 2016-12-14 16:47:58 · 181 阅读 · 0 评论 -
Java并发-final
final域的重排序规则1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 假设一个线程A执行writer()方法,随后另一个线程B执行reader()方法。写final域的重排序规则写final域的重排序规...原创 2018-07-10 10:47:21 · 435 阅读 · 0 评论 -
Java并发-类的初始化
在首次发生下列任意一种情况时,一个类或接口类型T将被立即初始化。 1)T时一个类,而且一个T类型的实例被创建。 2)T是一个类,且T中声明的一个静态方法被调用。 3)T中声明的一个静态字段被赋值。 4)T中方声明的一个静态字段被使用,而且这个字段不是一个常量字段。 5)T是一个顶级类,而且一个断言语句嵌套在T内部被执行。...原创 2018-07-10 20:23:55 · 341 阅读 · 0 评论 -
Java并发-线程的状态
线程的状态线程状态变迁 Java将操作系统中的运行和就绪两个状态合并称为运行状态。原创 2018-07-11 10:42:11 · 157 阅读 · 0 评论 -
Java并发-Thread.intrrupted()与isInterrupted()与interrupt()
中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。其他线程通过调用该线程的interrupt()方法对其进行中断操作。 线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。 有一点需要注意:如果线程已经处于终结状态,即使该线程被中断过,在调用该线程对象的i...原创 2018-07-11 12:02:42 · 682 阅读 · 0 评论 -
Java并发-对象监视器
对于同步块的实现使用了monitorenter和monitorexit指令,而同步方法则是依靠方法修饰符上的ACC_SYNCHRONIZED来完成的。 无论采用哪种方式,其本质是对一个对象的监视器进行获取,而对这个获取过程是排他的,也就是说统一时刻是能有一个线程获得到由synchronized所保护对象的监视器。任意线程对Object的访问,首先要先获得Object的监视器。如果获取失败...原创 2018-07-11 14:19:02 · 7601 阅读 · 0 评论 -
Java并发-等待/通知
wait(),notify()及notifyAll()注意细节1.使用wait(),notify()和notifyAll()时需要先对调用对象加锁。 2.调用wait()方法后,线程状态由RUNNING变为WAITING,并将当前线程放置到对象的等待队列。 3.notify()或notifyAll()方法调用后,等待线程依旧不会从wait()返回,需要调用notify()或notifyAl...原创 2018-07-11 18:31:57 · 293 阅读 · 0 评论 -
Java并发-AQS如何完成线程同步
同步队列AQS依赖内部的同步队列(FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器将会将当前线程以及等待状态等信息构造成为一个节点(NODE)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。 独占式同步状态获取与释放public final void acquire(int arg) { ...原创 2018-07-23 17:53:58 · 577 阅读 · 0 评论 -
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 阅读 · 0 评论 -
Java并发-ReentrantReadWriteLock锁降级/锁升级
读写锁读写锁维护了一对锁,一个读锁和一个写锁。 在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。锁升级/锁降级同一个线程中,在没有释放读锁的情况下,就去申请写锁,这属于锁升级,ReentrantReadWriteLock是不支持的。public class ReadWriteTest { public static void ...原创 2018-07-24 17:24:53 · 3709 阅读 · 0 评论 -
Java并发-CountDownLatch
CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作。 CountDownLatch的构造函数接受一个int类型的参数作为计数器。 当我们调用COuntDownLatch的countDown()时,N就会减1,CountDownLatch的await()会阻塞当前线程,知道N变成0。CountDownLatch的实现分析CountDow...原创 2018-07-29 11:40:25 · 193 阅读 · 0 评论 -
Java并发-CyclicBarrier
CyclicBarrier它允许一组线程互相等待,知道到达某个公共屏障点。barrier在释放等待线程后可以重用。 CyclicBarrier的内部是使用重入锁ReentrantLock和Condition。 public CyclicBarrier(int parties) { this(parties, null); } public Cy...原创 2018-07-30 12:00:18 · 203 阅读 · 0 评论 -
Java并发-Semaphore
Semaphore用来控制同时访问特定资源的线程数量,它通过协调各个线程来保证合理的使用公共资源。 比如马路上要限制流量,只允许同时有100辆车在这条路上行驶,其他的都在路口等待,所以前100辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,如果100辆中有5辆已经离开马路,那么后面就允许有5辆车驶入马路Semaphore内部包含公平锁和非公平锁,继承内部类Sync,其中Sync继承...原创 2018-07-30 14:22:51 · 190 阅读 · 0 评论 -
Java并发-线程池
线程池的好处1.降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 2.提高相应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 3.提高线程的可管理性。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控。线程池的处理流程1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创...原创 2018-07-30 16:43:17 · 208 阅读 · 0 评论 -
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 · 208 阅读 · 0 评论 -
Java并发-Executor框架
Executor框架的两级调度模型 Executor框架主要由3部分组成 1.任务:包括被执行任务需要实现的接口:Runnable接口或Callable接口 2.任务的执行:包括执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。(ThreadPoolExecutor和ScheduledThreadPoolExecutor) 3.异步计算...原创 2018-07-31 11:01:00 · 395 阅读 · 0 评论 -
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 · 1760 阅读 · 0 评论 -
Java并发-Concurrent包的实现
Concurrent首先,声明共享变量为volatile。 然后,使用CAS的原子条件更新来实现线程之间的同步。 同时,配合以volatile的读/写和CAS所具有的volatile读和写的内存语义来实现线程之间的通信...原创 2018-07-09 19:57:52 · 385 阅读 · 0 评论 -
Java并发-公平锁与非公平锁
1.公平锁和非公平锁释放时,最后都要写一个volatile变量的state。 protected final boolean tryRelease(int releases) { int c = getState() - releases; if (Thread.currentThread() != getExclusiveOwnerThre...原创 2018-07-01 17:47:57 · 203 阅读 · 0 评论 -
Java并发-volatile
volatile自身特性可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:对任意单个volatile变量的读/写具有原子性,单类似于volatile++这种复合操作不具有原子性 等同于 volatile写和锁的释放有相同的内存语义;volatile读和锁的获取有相同的内存语义volatile写内存语义当写一个...原创 2018-07-01 16:07:01 · 212 阅读 · 0 评论 -
简易生产者消费者
public class ProConDemo { public static void main(String[] args) { Store s = new Store(5, 0); Pro producer1 = new Pro(s); Pro producer2 = new Pro(s); Con consumer1 = new Con(s); Con consume原创 2016-12-05 17:59:18 · 167 阅读 · 0 评论 -
java线程死锁
某个任务在等待另一个任务,而后者又在等待别的任务,这样一直等下去,直到这个链条上的任务又在等待第一个任务释放锁,这得到了一个任务之间相互等待的连续循环,没有哪个线程能继续,这被称之为“死锁”。public class Philosopher implements Runnable { public static class Chopstick { private boolea原创 2016-12-14 15:18:30 · 206 阅读 · 0 评论 -
java线程 CyclicBarrier
import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.E原创 2016-12-15 10:05:59 · 221 阅读 · 0 评论 -
java线程 semaphore
import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Semaphore;public class SemaphoreTest { public static void m原创 2016-12-15 15:28:20 · 204 阅读 · 0 评论 -
(转)java线程 Exchanger
import java.util.concurrent.Exchanger;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;public class ExchangerTest { private转载 2016-12-15 16:01:12 · 236 阅读 · 0 评论 -
volatile可見性
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class Practice17 { public static void main(String[] args) { ExecutorService es = Executors.newCachedThre原创 2017-01-12 14:33:50 · 247 阅读 · 0 评论 -
Volatile的可見性與禁止指令重排
public class ThreadTest { public static volatile int race = 0; public static void increase() { race++; } private static final int THREADS_COUNT = 20; public static void main(String[] args)原创 2017-02-04 13:33:43 · 844 阅读 · 0 评论 -
线程数设多少合适??
线程数设多少合适??提问:工作线程数是不是设置的越大越好? 回答:肯定不是的 1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义 2)线程切换是有开销的,如果线程切换过于频繁,反而会使性能降低提问:如果CPU是单核,设置多线程有意义么,能提高并发性能么? 回答:即使是单核,使用多线程也是有意义的 1)多线程编码可以让我们的服务/代码...原创 2018-04-05 21:32:43 · 10644 阅读 · 0 评论 -
Java并发-synchronized与原子操作的实现原理
synchronizedJava中的每一个对象都可以作为锁 1.对于普通同步方法,锁是当前实例对象 2.对于静态同步方法,锁是当前类的Class对象 3.对于同步方法块,锁是Synchronized括号里配置的对象 当一个线程驶入访问同步块时,它首先必须得到锁。退出或者抛出异常时必须释放锁。实现原理JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但实现细节不一...原创 2018-06-23 14:22:37 · 1941 阅读 · 0 评论 -
Java并发-Java内存模型
线程之间的通信与同步通信是指线程之间以何种机制来交换信息,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。 在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显式进行通信。同步是指程序中用于控制不同线程间操作发生相对顺序的机制。 在共享内存并发模型里,同步时显式进行的。程...原创 2018-06-23 14:50:03 · 270 阅读 · 0 评论 -
Java并发-内存屏障
现代的处理器使用写缓冲区临时保存内存写入的数据。写缓冲区可以保证指令流水线持续运行,他可以避免由于处理器停顿下来等待内存写入数据而产生的延迟。同时,通过以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一个内存地址的多次写,减少对内存总线的占用。每个处理去上的写缓冲区,仅仅对它所在的处理器可见。这个特性会对内存操作的执行顺序产生重要的影响:处理器对内存的读/写操作的执行顺序,不一定与内存实际发生的...原创 2018-06-23 16:35:15 · 361 阅读 · 0 评论 -
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 · 354 阅读 · 0 评论 -
Java并发-顺序一致性模型
顺序一致性模型顺序一致性内存模型有两大特性 1)一个线程中的所有操作必须按照程序的顺序来执行。 2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。 在概念上,顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程,同时每一个线程必须按照程序的顺序来执行内存读/写操作。...原创 2018-06-24 19:37:36 · 1846 阅读 · 0 评论 -
Java并发-ThreadLocal
ThreadLocal与线程同步机制的区别线程同步机制是共享同一个变量 ThreadLocal是为每个线程创建一个变量副本ThreadLocalThreadLocal内部还有一个静态内部类ThreadLocalMap,该内部类才是实现线程隔离机制的关键,get()、set()、remove()都是基于该内部类操作。ThreadLocalMap提供了一种用键值对方式存储每一个线程的...原创 2018-06-17 20:22:31 · 159 阅读 · 0 评论 -
Java并发-synchronized与ReentrantLock之间的选择
可重入ReentrantLock和synchronized其实都是可重入的锁。两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。实现synchronized是依赖JVM实现的,而ReentrantLock是JDK实现的性能synchronized优化以前,性能比ReentrantLock差很多。自从Synchronized引入了...原创 2018-06-19 19:50:50 · 511 阅读 · 0 评论 -
Java并发-活跃性问题
饥饿当线程由于无法访问它所需要的资源而不能继续执行时,就发生了“饥饿“。 引发饥饿的最常见资源就是CPU时钟周期。(无限循环,或者无限制地等待某个资源) Thread API中定义的线程优先级只是作为线程调度的参考,定义了10个优先级,JVM根据需要将它们映射到操作系统的调度优先级。这种映射是与特定平台相关的,可能某个操作系统中两个不同的Java优先级可能被映射到同一个优先级。 经常可能...原创 2018-06-19 20:54:32 · 613 阅读 · 0 评论 -
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 · 808 阅读 · 0 评论