![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java 多线程
十万大山深处
这个作者很懒,什么都没留下…
展开
-
JAVA------synchronized关键字
概述 synchronized关键字是通过对一个对象加锁,来解决多线程间的同步问题,具体使用不做赘述,主要讨论synchronized的实现原理。 详情 先看段代码: public class T09_Sync { public static void main(String[] args) { Object o=new Object(); synchronized (o){ System.out.println("Hello");原创 2020-11-02 14:07:49 · 118 阅读 · 0 评论 -
JAVA------Volatile关键字
概述 volatile的功能有两个:线程可见性+禁止指令重排序 几个基本概念 原子性、可见性、有序性 原子性:一个或多个操作要么全部执行,要么不执行,且执行时不会被打断,如int i=1; 可见性:多个线程访问同一个变量时,一个线程修改变量,其他各个线程能够立即看到修改的值; 有序性:程序的执行顺序按照代码的先后顺序执行; 指令重排序 先看一段代码 public class T10_Disorder { private static int x = 0, y = 0; private st原创 2020-10-30 16:07:48 · 76 阅读 · 0 评论 -
JAVA------多线程之同步容器&并发容器
同步容器 在java早期,提供了Vector和HashTable两个同步容器,分别是List和Map的具体实现。 查看其源码,实现线程同步的方法是对每个公共使用synchronize关键字,在方法上实现同步。源码如下: //vector.add(e) public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[el原创 2020-10-23 15:00:57 · 196 阅读 · 0 评论 -
JAVA------多线程之ThreadLocal
概述 ThreadLocal可以理解为一个工具类,能够为多个线程提供保存在各个线程内部的局部变量,通过提供的set和get方法来实现线程独立地对这些变量的修改和访问。因为变量保存在线程内部,线程在操作时不会产生线程不安全问题。 使用示例 以下是简单的使用示例,两线程都对变量赋不一样的值,分别访问,删除 public class T07_ThreadLocal { static ThreadLocal<String> local = new ThreadLocal<.原创 2020-10-21 17:21:13 · 132 阅读 · 0 评论 -
JAVA------多线程之线程池
概述 是什么? 看名字线程池是在一个池(容器)里面事先创建若干个线程,需要的时候直接从池子里拿而不是自己创建,从而减少线程对象创建和销毁的时间开销。 为什么? 今假设创建一线程执行某任务,执行时间如下:创建线程T1+执行任务T2+销毁线程T3,当T1+T3>T2时,那么当此种任务数量很多时,那么大多数的时间都是在创建和销毁线程,性能利用率低下。 此时使用线程池能极大地提高吞吐量,提高效率。这种情况可以类比仓库工具管理,假设仓库有10把扳手,当有工人需要扳手的时候直接向仓库申请,用...原创 2020-10-19 18:01:04 · 156 阅读 · 1 评论 -
JAVA------JUC源码探究之LockSupport
概述 是什么? 查看官网文档可以得知,LockSupport是用于创建锁或其他同步器基本的线程阻塞原语。换句话说,它是AQS等其他锁或同步器实现线程阻塞和唤醒的底层基础。 方法概述 LockSupport中提供了几个基本方法如下: park():除非有许可,当前线程阻塞,禁止被调度; 当发生以下三种情况时,将立即释放: 其他线程以此线程为参数调用unpark(Thread)方法; 其他线程将此线程打断; 发生了不可预料的事情 park(Object):阻塞当前线程,释放条件与pa...原创 2020-10-15 17:48:07 · 207 阅读 · 0 评论 -
JAVA------JUC源码探究之AbstractQueuedSynchronizer(AQS)
概念 首先,AQS是什么? 在官网的解释中,AQS是一个基于 先进先出(FIFO)队列,可以构建其他同步装置(semaphores,events)的基...原创 2020-10-13 14:32:09 · 117 阅读 · 0 评论 -
JAVA------JUC源码探究之Lock
概述 在java多线程同步过程中,除了使用synchronized关键字外,还在java.util.concurrent.lock包中提供了一些手动加锁的类。类关系如下: 常用的锁----ReentrantLock 是什么? ReentrantLock类是java提供的给 同步代码块 加锁,保证线程同步的类。主要依赖的原理为volatile+CAS。 有哪些种类? ReentrantLock为我们提供了公平锁和非公平锁两种,默认为非公平锁,若要使用...原创 2020-09-28 15:54:22 · 202 阅读 · 0 评论 -
JAVA------JUC源码探究之Atomic-xxx
在多线程进行同步时,通常是使用synchronized关键字,或者lock等其他方式,来保证操作而原子性。然而,在java.util.concurrent.atomic包中,提供了一些已经能够实现原子性操作的类。 功能 AtomicXxx与普通的变量相比,最大的不同在于多线程对原子量的读写能够在不加锁的情况下保证线程安全。例如,对于普通的int i++,在多线程对它进行读写时,是线程不安全的。而原子量atomicInteger.incrementAndGet()能够在多线程同时调用时,保证其线程安全。原创 2020-09-27 17:14:36 · 141 阅读 · 0 评论 -
JAVA------探索CAS
概念 什么是CAS,它的全称为compare and swap,比较并且交换。 他会进行如下一波操作: 假设,当前内存中有原始数据A,当前数据V,更新后的数据S, 比较原始数据A和当前数据V是否相等;(比较) 若相等,则将S写入V的内存地址;(交换) 返回操作是否成功; 那么它会产生什么效果? 在多个线程同时操作一个共享数据时,它能保证每次只有一个线程对数据进行操作,但是其他线程不会阻塞。因为每个线程在更新数据前都要进行一次比较,若数据已被其他线程修改,则操作失败。 原理 在java中,C原创 2020-09-27 16:15:17 · 69 阅读 · 0 评论 -
JAVA------多线程之探究生产者与消费者
问题描述 生产者和消费者在同一时间段内共用同一个存储空间,生产者向空间里存放数据,而消费者取用数据。 问题分析 生产者:负责生产数据,若此时容器已满,则停止生产(进入阻塞状态,释放锁);若容器未满,则 生产数据,并唤醒所有线程,可能是消费者,也可能是生产者。 消费者:负责消费数据,若此时容器已空,则排队等候(进入阻塞状态,释放锁);若容器为空,则消费数据,并唤醒所有线程,可能是消费者,也可能是生产者。 代码实现 package thread.question; import java.ut原创 2020-09-24 16:00:41 · 45 阅读 · 0 评论 -
JAVA------多线程之探究同步
问题提出 今假设今天晚上北京到上海的高铁只剩下1张二等座,购票流程为查询余票,付钱,出票三个步骤。此时张三和李四分别在不同的窗口购票,若此时没有同步机制,则可能出现张三在出票前,李四查询任然有一张余票,可付款,出票,则此时会出现一张票同时卖给两个人。这种情况当然是不允许的,不然春运回家时会发现你的座位上坐着一个抠脚大汉。。。。 解决方法 解决方法很简单,只要保证张三访问火车票在退出(出票)前,其他人(李四)不能够访问操作这张票就可以。 线程同步 由上述例子...原创 2020-09-24 15:09:22 · 213 阅读 · 0 评论 -
JAVA------多线程之开始
JAVA 多线程(一) 什么是线程--What 线程是程序中不同的执行路径 并发:并非是同一时间执行多个线程,而是在一段时间内,cpu交替执行多个线程指令。 并行:在同一时间内,多个任务同时执行 如何启动线程--How 继承Thread类 实现Runnable接口(有返回值时,实现Callable接口) jdk8后使用表达式 调用线程的start()方法后,main线程继续执行。 package thread; /** * 启动现成的几种方式 *继承Thread * Runna.原创 2020-09-23 15:26:42 · 96 阅读 · 0 评论