juc

JUC(五)——Callable

ⅰ亾dé卋堺 提交于 2019-12-19 22:05:04
JUC(一)——Locks JUC(二)——深入理解锁机制 JUC(三)——线程安全类 JUC(四)——强大的辅助类讲解 JUC(五)——Callable JUC(六)——阻塞队列 JUC(七)——线程池简单使用 JUC(八)——线程池深入讲解 创建线程的方式一共有四种 1、继承Thread类创建线程 2、实现Runnable接口创建线程 3、使用Callable和Future创建线程 4、使用线程池例如用Executor框架 前面两种大家肯定都了解,这里我们讲解第三种 使用Callable和Future创建线程 Runnable接口和Callable接口的区别 //创建新类MyThread实现runnable接口 class MyThread implements Runnable { @Override public void run ( ) { } } //新类MyThread2实现callable接口 class MyThread2 implements Callable < Integer > { @Override public Integer call ( ) throws Exception { return 200 ; } } 1、是否有返回值 Callable有返回值,返回值类型就是泛型类型 Runnable没有返回值 2、是否抛异常 Callable抛异常

JUC(二)——深入理解锁机制

懵懂的女人 提交于 2019-12-19 12:59:23
对于锁大家肯定都不陌生,锁分为synchronize和lock 但是大家是否知道锁到底锁住的是什么呢? 接下来我们举几个例子来了解锁(这里使用synchronize来演示) 1、该代码先打印的是短信还是邮件? class Phone { public synchronized void sendSMS ( ) throws Exception { System . out . println ( "------短信" ) ; } public synchronized void sendEmail ( ) throws Exception { System . out . println ( "------邮件" ) ; } public void getHello ( ) { System . out . println ( "------hello" ) ; } } public class Lock { public static void main ( String [ ] args ) throws Exception { Phone phone = new Phone ( ) ; new Thread ( ( ) - > { try { phone . sendSMS ( ) ; } catch ( Exception e ) { e . printStackTrace

Java 之 JUC

风流意气都作罢 提交于 2019-12-14 01:43:20
1. JUC 简介 在 Java 5.0 提供了 java.util.concurrent (简称JUC)包,在此包中增加了在并发编程中很常用的工具类, 用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中 的 Collection 实现等; 2. volatile 关键字 volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据是可见的;相较于 synchronized 是一种 较为轻量级的同步策略; volatile 不具备"互斥性"; volatile 不能保证变量的"原子性"; // 使用 volatile 之前 public class TestVolatile{ public static void main(String[] args){ ThreadDemo td = new ThreadDemo(); new Thread(td).start(); while(true){ if(td.isFlag()){ System.out.println("########"); break; } } } } class ThreadDemo implements Runnable{ private boolean flag = false; public void run(){ try{ //

java1.8的JUC

≯℡__Kan透↙ 提交于 2019-12-14 01:27:04
1.JUC是什么?    juc是java.util.concurrent.   1.1进程/线程      进程:一个程序运行就是一个进程,进程表示资源分配的基本单位(.exe程序如QQ,office等运行就是一个进程)      线程:一个进程里面的多个任务称为线程,程序运行的调度运行的最小单位(比如office检验单词报错就是一个线程)    1.2并发/并行      并发:两条或两条以上的线程执行某一个资源     并行:同时实行,同时实施    1.3高内聚,低耦合      在Java里,类封装内部资源,只提供可操作的接口。 来源: https://www.cnblogs.com/wstrm/p/12037984.html

JUC之公平锁与非公平锁

筅森魡賤 提交于 2019-12-12 07:15:08
公平锁与非公平锁 首先,公平锁与非公平锁谈谈你的理解? 1.公平和非公平锁是什么? 公平锁 :是指多个线程按照申请锁的顺序来获取锁,类似排队打饭,先来后到 非公平 :是指多个线程获取锁的顺序并不是按照申请锁的顺序来获取锁,有可能后申请的线程比先申请的线程优先获取锁 在高并发的情况下,有可能会造成优先级反转或者饥饿现象 并发包中ReentrantLock的创建可以指定构造函数的boolean类型来得到公平锁或非公平锁,默认为非公平锁 关于俩者 区别 : 公平锁: Threads acquire a fair lock in the order in which they requested 就是很公平,在并发环境中,每个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中, 以后会按照FIFO的规则从队列中取到自己 非公平锁 :a nonfair lock permits barging:threads requesting a lock can jump ahead of the queue of waiting threads if the lock happens to be available when it is requested 非公平锁比较粗鲁,上来就直接尝试占有锁,如果尝试失败

Java并发编程(3) JUC中的锁

余生颓废 提交于 2019-12-09 10:57:53
一 前言   前面已经说到JUC中的锁主要是基于AQS实现,而AQS( AQS的内部结构 、 AQS的设计与实现 )在前面已经简单介绍过了。今天记录下JUC包下的锁是怎么基于AQS上实现的 二 同步锁   同步锁不是JUC中的锁但也顺便提下,它是由synchronized 关键字进行同步,实现对竞争资源互斥访问的锁。   同步锁的原理:对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。在同一个时间点该同步锁能且只能被一个线程获取到,其他线程都得等待。   另外: synchronized是Java中的关键字且是内置的语言实现;它是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定;synchronized等待的线程会一直等待下去,不能响应中断。 三 JUC中的锁结构   相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁(它由自己实现、需要手动释放锁、能响应中断、可以多线程跑提高效率等)。下图是根据源码中查出画的类图,便知它提供的锁有好几种,下面一一分析。 四 可重入锁-ReentrantLock   重入锁ReentrantLock,顾名思义:就是支持重进入的锁,它表示该锁能够支持一个线程对资源的重复加锁。另外该锁孩纸获取锁时的公平和非公平性选择

java高并发系列 - 第12天JUC:ReentrantLock重入锁

喜欢而已 提交于 2019-12-09 10:56:43
java高并发系列 - 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇。 synchronized的局限性 synchronized是java内置的关键字,它提供了一种独占的加锁方式。synchronized的获取和释放锁由jvm实现,用户不需要显示的释放锁,非常方便,然而synchronized也有一定的局限性,例如: 当线程尝试获取锁的时候,如果获取不到锁会一直阻塞,这个阻塞的过程,用户无法控制 如果获取锁的线程进入休眠或者阻塞,除非当前线程异常,否则其他线程尝试获取锁必须一直等待 JDK1.5之后发布,加入了Doug Lea实现的java.util.concurrent包。包内提供了Lock类,用来提供更多扩展的加锁功能。Lock弥补了synchronized的局限,提供了更加细粒度的加锁功能。 ReentrantLock ReentrantLock是Lock的默认实现,在聊ReentranLock之前,我们需要先弄清楚一些概念: 可重入锁:可重入锁是指同一个线程可以多次获得同一把锁;ReentrantLock和关键字Synchronized都是可重入锁 可中断锁:可中断锁时只线程在获取锁的过程中,是否可以相应线程中断操作。synchronized是不可中断的,ReentrantLock是可中断的 公平锁和非公平锁

【Java语言特性学习之四】JUC

荒凉一梦 提交于 2019-12-06 20:48:25
一、JUC 简介 在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了并发编程常用工具类,包括线程池,异步IO和轻量级任务框架;还提供了设计用于多线程上下文中的Collection实现等。 目的就是为了更好的支持高并发任务,让开发者利用这个包进行的多线程编程时可以有效的减少竞争条件和死锁线程. 按照功能可以大致划分如下: juc-locks 锁框架 juc-atomic 原子类框架 juc-sync(tools) 同步器框架 juc-collections 集合框架 juc-executors 执行器框架 参考: *JUC线程框架深度解析 *透彻理解Java并发编程 Java之JUC JUC 来源: https://www.cnblogs.com/cac2020/p/11997618.html

Java多线程之内存可见性

一曲冷凌霜 提交于 2019-12-06 03:31:30
Java内存模型( JMM ) : 1) 所有的变量都存储在主内存中 2) 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本 ( 主内存中该变量的一份拷贝 ) JMM 两条规定: 1) 线程对共享变量的所有操作都必须在自己的工作内存中进行 2) 不同线程之间无法直接访问其他线程工作内存中的共享变量, 线程间共享变量值的传递必须通过主内存 线程间共享变量可见性实现的原理: 线程A 对共享变量的修改想被线程B 及时看到, 必须要经过以下2个步骤: 1) 把线程A 工作内存中更新过的共享变量刷新到主内存中 ( store ) 2) 将主内存中最新的共享变量的值共享到线程B 工作内存中 ( load ) Java 语言层面支持的可见性实现方式: 1) synchronized 2) volatile JUC 包下的类也可以实现可见性 1) Atomic 2) ReentrantLock 3) Semaphore 1. synchronized 实现可见性 JMM 关于 synchronized 的两条规定: 1) 线程释放锁前, 必须把共享变量的最新值从该线程的工作内存刷新到主内存中 2) 线程持有锁时, 将清空该线程工作内存中共享变量的值, 从主内存中读取最新的值 synchronized 实现可见性的原因: 线程释放锁前对共享变量的修改在下次持有锁时对其他线程可见

JUC-0-JUC简介

一个人想着一个人 提交于 2019-12-05 11:05:04
Java JUC 简介 在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于线程的自定义子 系统,包括线程池、异步 IO 和轻量级任务框架。 提供可调的、灵活的线程池。还提供了设计用于 多线程上下文中的 Collection 实现等 java.util.concurrent包 来源: https://www.cnblogs.com/wf-zhang/p/11921715.html