![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
蛇皮皮蛋
求大佬笔下留情……
展开
-
多线程的基本操作 (2)
1.volatile与Java内存模型在Java中Java的内存模型是围绕着原子性,有序性和可见性展开的。当在Java中用volatile去声明一个变量时,相当于告诉虚拟机这个变量时容易被程序和线程修改,所以为了确保这个变量被修改后应用程序范围内所有的线程都能看到这个变量的改动虚拟机必须采用一些特殊的手段来保证这个变量的可见性。但是,需要注意的是虽然volatile对于操作的原子性有所...原创 2018-07-28 23:35:29 · 4104 阅读 · 0 评论 -
队列同步器(AbstractQueuedSynchronizer)(一)
队列同步器AbstractQueuedSynchronizer是用来构建锁或者其他同步组件的基础框架,它使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。队列同步器的接口 同步器的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法...原创 2019-03-28 16:05:09 · 4102 阅读 · 0 评论 -
重入锁、读写锁实现
前置知识AQS:https://blog.csdn.net/qq_37598011/article/details/88871352重入锁实现重入重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性需要解决以下两个问题。线程再次获取锁:锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。 锁的最终释放:线程重复n次获取了锁,随后在第n次释放...原创 2019-04-01 15:48:44 · 4391 阅读 · 1 评论 -
队列同步器(AbstractQueuedSynchronizer)(二)
独占式同步状态获取与释放获取 通过调用同步器的acquire(int arg)方法可以获取同步状态,该方法对中断不敏感,也就是由于线程获取同步状态失败后进入同步队列中,后续对线程进行中断操作时,线程不会从同 步队列中移出。 public final void acquire(int arg) { if (!tryAcquire(arg) &&...原创 2019-03-29 15:51:00 · 4031 阅读 · 0 评论 -
synchronized的实现原理
利用synchronized实现同步的基础:Java中的每一个对象都可以作为锁。具体表现 为以下3种形式。对于普通同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。 从JVM规范中可以看到Synch...原创 2018-12-17 12:00:17 · 3902 阅读 · 0 评论 -
Future模式
Future模式是多线程开发中常见的设计模式,它的核心思想是异步调用。对于Future模式来说,它无法立即返回你需要的数据,但是它会返回一个契约,将来你可以凭借这个契约去获取你需要的信息。这是传统的同步方法,调用一段耗时的程序。当客户端发出call请求,这个请求需要很长的一段时间才会返回,客户端一直在等待直到数据返回随后再进行其他任务的处理。而使用Future模式:这个模型展示...原创 2018-08-23 22:57:42 · 13093 阅读 · 0 评论 -
JDK并发包(线程池)(2)
在线程池中寻找堆栈首先来看下这段代码package thread.pool;import java.util.concurrent.SynchronousQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class Demo { p...原创 2018-08-08 22:59:00 · 4026 阅读 · 0 评论 -
ThreadLocal使用及原理
1.ThreadLocal的简单使用从ThreadLocal的名字上可以看到,这是个线程的局部变量。也就是说只有当前线程可以访问,既然是只有当前线程池可以访问的数据自然是线程安全的。package thread;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Da...原创 2018-08-13 00:00:37 · 12317 阅读 · 0 评论 -
JDK并发包(线程池)(1)
1.什么是线程池为了避免系统频繁地创建和销毁线程,我们可以让创建的线程进行复用。如同数据库连接池一样当系统使用数据库时不是创建一个新的连接,而是从连接池中获取一个可用的连接,反之当需要关闭连接是,并不是真的进行关闭连接,而是将这个连接返还给连接池。通过这种方式,可以节约很多创建和销毁对象的时间。线程池也是类似的概念。线程池中总有几个活跃的线程,当你需要使用线程时,可以从池中拿一个空闲线程,...原创 2018-08-07 22:17:44 · 4185 阅读 · 0 评论 -
JDK并发包(2)
1.允许多个线程同时访问:信号量(Semaphore)从广义的来说,信号量是对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock一次都只允许一个线程访问一个资源,而信号量可以指定多个线程,同时访问某一个资源。信号量主要提供以下两个构造器:public Semaphore(int permits);public Semaphore(int permits,...原创 2018-08-02 23:54:25 · 4050 阅读 · 0 评论 -
JDK并发包(1)
1.重入锁重入锁可以替代synchronized关键字。在JDK5.0中重入锁性能好于synchronized但是从JDK6.0开始,JDK对synchronized做了大量优化是得两者性能差距不多。重入锁使用java.util.concurrent.locks.ReentrantLock类实现:public class ReetrantLock implements Runnabl...原创 2018-08-01 23:48:51 · 4206 阅读 · 0 评论 -
多线程的基本操作(1)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。1、新建状态(New):新创建了一个线程对象。2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。3、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。4、阻塞状态(Blocked):阻塞状态是线程因为某种原因...原创 2018-07-28 00:46:24 · 5364 阅读 · 0 评论 -
JDK并发包(3)
1.循环栅栏:CyclicBarrierCyclicBarrier是另一种多线程并发控制实用工具。它和CountDownLatch非常类似,它也可以实现线程间的计数等待,而且他的功能比CountDownLatch更加复杂强大。假如将计数器设为10,那么在凑足10个线程后,计数器会归零,然后接着凑下一批10个线程。这就是它循环栅栏的内在含义。CyclicBarrier可以接受一个参数作为ba...原创 2018-08-03 22:00:31 · 4052 阅读 · 0 评论 -
多线程与高并发基本概念
1.同步(Synchronous)与异步(Asynchronous) 同步和异步通常形容一次方法的调用。同步方法调用开始后调用者必须等到方法调用返回才能进行后续行为。异步方法则像一个消息的传递,调用方法后立即返回而方法体则在后台继续运行,调用者无需等待继续后续操作。2.并发(Concurrency)和并行(Parallelism) 并发和并行都能表示两个或多个任务一起执...原创 2018-07-26 23:27:52 · 15814 阅读 · 0 评论 -
CopyOnWriteArrayList 实现原理
CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全的ArrayList,写操作通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可以称这种容器为"写时复制器",Java并发包中类似的容器还有CopyOnWriteSet,不过在CopyOnWriteSet中任然是调用的是CopyOnWriteArrayList。实现原理 ...原创 2019-05-21 12:40:06 · 4151 阅读 · 0 评论