![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发
文章平均质量分 82
想飞的盗版鱼
这个作者很懒,什么都没留下…
展开
-
并发(十四)--创建线程的方式
并发(十四)–创建线程的方式一、Java中创建线程主要有三种方式:1、继承Thread类创建线程类:定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。因此把run()方法称为执行体。创建Thread子类的实例,即创建了线程对象。调用线程对象的start()方法来启动该线程。示例代码为:package com.thread; public class FirstThreadTest extends Thread{ int i =原创 2020-07-12 17:48:39 · 79 阅读 · 0 评论 -
并发(十三)--生产者消费者
并发(十三)–生产者消费者手写一个生产者和消费者的例子一、用synchronized对存储加锁,然后用object原生的wait() 和 notify()做同步。import java.util.LinkedList;import java.util.Queue; public class ProducerAndConsumer { private final int MAX_LEN = 10; private Queue<Integer> queue = new L转载 2020-07-12 17:26:50 · 152 阅读 · 0 评论 -
并发(十二)--ThreadLocal
并发(十二)–ThreadLocal一、ThreadLocal是什么?首先说明,ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。ThreadLocal类提供了一种线程局部变量(ThreadLocal),即每一个线程都会保存一份变量副本,每个线程都可以独立地修改自己的变量副本,而不会影响到其他线程,是一种线程隔离的思想。二、实现原理:ThreadLocal提供四个方法:public T get() {原创 2020-07-12 17:13:18 · 289 阅读 · 0 评论 -
并发(十一)--线程池
并发(十一)–线程池1.概述:线程池,顾名思义就是存放线程的池子,池子里存放了很多可以复用的线程。如果不用类似线程池的容器,每当我们需要执行用户任务的时候都去创建新的线程,任务执行完之后线程就被回收了,这样频繁地创建和销毁线程会浪费大量的系统资源。因此,线程池通过线程复用机制,并对线程进行统一管理,具有以下优点:降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗;提高响应速度。当有任务到达时,无需等待新线程的创建便能立即执行;提高线程的可管理性。线程是稀缺资源,如果无限制的原创 2020-07-11 19:22:33 · 198 阅读 · 0 评论 -
并发(十)--CountDownLatch、CyclicBarrier和Semaphore
并发(十)–CountDownLatch、CyclicBarrier和Semaphore一、CountDownLatch:CountDownLatch所描述的是”在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待“。在API中是这样描述的:用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法原创 2020-07-11 16:30:55 · 261 阅读 · 0 评论 -
并发(九)--阻塞队列
并发(九)–阻塞队列一、什么是阻塞队列?阻塞队列就是一种支持阻塞的插入和移除操作的特殊容器。在多线程中,所谓阻塞:在某些情况下会挂起线程(阻塞),一旦条件满足,被挂起的线程又回自动被唤醒。为什么需要BlockingQueue:好处:我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQueue都给你一手包办了。阻塞的插入:当队列满时,向队列中插入元素的线程会被阻塞,直到队列中有元素被移除,即队列不满时,阻塞的线程才能继续向队列中插入元素;阻塞的移除:当队列中没有元原创 2020-07-11 11:28:09 · 166 阅读 · 0 评论 -
并发(八)--线程状态
并发(八)–线程状态线程的状态原创 2020-07-10 18:33:39 · 511 阅读 · 0 评论 -
并发(七)--CAS
并发(七)–CASCAS的全称是Compare And Swap,即比较交换,当然还有一种说法:Compare And Set,调用原生CAS操作需要确定三个值:要更新的字段预期值新值其中,要更新的字段(变量)有时候会被拆分成两个参数:1.实例 2.偏移地址。也许你看到这里,会觉得云里雾里,不知道我在说什么,没关系,继续硬着头皮看下去。我们先来看看compareAndSet的源码。compareAndSet源码浅析:首先,调用这个方法需要传递两个参数,一个是预期值,一个是新值,这个预期原创 2020-07-10 10:34:49 · 244 阅读 · 0 评论 -
并发(六)--重入锁ReentrantLock
并发(六)–重入锁ReentrantLock重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。一、实现重进入:重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性的实现需要解决以下两个问题。线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,原创 2020-07-08 16:54:40 · 207 阅读 · 0 评论 -
并发(五)--AQS(队列同步器)
并发(五)–AQS(队列同步器)AQS是AbstractQueuedSynchronizer的简称。AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,如下图所示。AQS为一系列同步器依赖于一个单独的原子变量(state)的同步器提供了一个非常有用的基础。子类们必须定义改变state变量的protected方法,这些方法定义了state是如何被获取或释放的。鉴于此,本类中的其他方法执行所有的排队和阻塞机制。子类也可以维护其他的state变量,但是为了保证同步,必须原子地操作这些变量。原创 2020-07-07 11:02:52 · 295 阅读 · 0 评论 -
并发(四)--各种锁
并发(四)–各种锁1,什么是锁:在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制。锁旨在强制实施互斥排他、并发控制策略。锁通常需要硬件支持才能有效实施。这种支持通常采取一个或多个原子指令的形式,如"test-and-set", “fetch-and-add” or “compare-and-swap””。这些指令允许单个进程测试锁是否空闲,如果空闲,则通过单个原子操作获取锁。2,乐观锁、悲观锁:乐观锁:乐观锁总是认为不存在并发问题,原创 2020-07-05 22:04:02 · 390 阅读 · 0 评论 -
并发(三)--synchronized的理解(以及锁升级)
并发(三)–synchronized的理解(以及锁升级)一、Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:确保线程互斥的访问同步代码保证共享变量的修改能够及时可见有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:修饰普通方法修饰静态方法修饰代码块接下来我就通过几个例子程序来说明一下这三种使用方式(为了便于比较,三段代码除了Synchron原创 2020-07-05 21:11:25 · 325 阅读 · 0 评论 -
并发(二)--JMM模型以及原子性、可见性、顺序性
并发(二)–JMM模型以及原子性、可见性、顺序性一、JMM模型:java的并发采用的是共享内存模型,java线程之间的通信总是隐式进行,整个通信过程对程序员完全透明。java线程之间的通信由java内存模型(简称JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见,JMM定义了线程和主内存之间的抽象关系:共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存保存了被该线程使用到的主内存的副本拷贝,线程对变量的所有操作都必须原创 2020-07-05 17:14:28 · 638 阅读 · 0 评论 -
并发(一)--谈谈对volatile的理解
并发(一)–谈谈对volatile的理解一、volatile的特性:volatile关键字是比较轻量级,只可以修饰变量。Java内存模型对volatile专门定义了一些特殊的访问规则,当一个变量定义为volatile之后,它将具备两种特性。保证此变量对所有线程的可见性,即当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。而普通变量不能做到这一点,普通变量的值在线程间传递均需要通过主内存来完成,例如,线程A修改一个普通变量的值,然后向主内存进行回写,另外一条线程B在线程A回写完成了之原创 2020-07-04 22:18:05 · 280 阅读 · 0 评论