JUC并发
2021-09-08 15:22:43 22 举报
还在完善
作者其他创作
大纲/内容
1、JUC概述
- 什么是JUC
在Java中,线程部分是一个重点,本篇文章说的JUC 也是关于线程的。JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。
线程和进程概念
进程与线程
进程(Process )是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。,
线程( thread))是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,—个进程中可以并发多个线程,每条线程并行执行不同的任务。。
- 总结来说 线程∶系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。·线程∶系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。
线程的状态
NEW(新建)
RUNNABLE(准备就绪)
BLOCKED(阻塞)
WAITING(不见不善)
TIMED_WAITING(过时不候)
TERMINATED(终结)
wait和sleep
( 1 ) sleep是Thread 的静态方法,wait是Object的方法,任何对象实例都能调用。
( 2 ) sleep不会释放锁,它也不需要占用锁。wait 会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized 中)。-
( 3)它们都可以被interrupted方法中断。·
并发和并行
串行表示所有任务都——按先后顺序进行。串行意味着必须先装完一车柴才能运送这车柴,只有运送到了,才能卸下这车柴,并且只有完成了这整个三个步骤,才能进行下一个步骤。。
并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。并行的效率从代码层次上强依赖于多进程/多线程代码,从硬件角度上则依赖于多核CPU。.
并发(concurrent)指的是多个程序可以同时运行的现象,更细化的是多进程可以同时运行或者多指令可以同时运行。但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,==并发的重点在于它是一种现象==,==并发描述的是多进程同时运行的现象==。但实际上,对于单核心CPU来说,同一时刻只能运行一个线程。所以,这里的"同时运行"表示的不是真的同一时刻有多个线程运行的现象,这是并行的概念,而是提供一种功能让用户看来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占CPU的,而是执行一会停一会。- 要解决大并发问题,通常是将大任务分解成多个小任务,由于操作系统对进程的
总结:
并发:同一时刻多个线程在访问同一个资源,多个线程对一个点·
例子∶春运抢票电商秒杀....
并行:多项工作一起执行,之后再汇总,
例子:泡方便面,电水壶烧水,一边撕调料倒入桶中。
补充:并发是把任务在不同的时间点交给处理器处理。不一定在同一个时间点处理,cpu来回切换执行
并行则是两个或两个以上的同时发生(执行)
并发:是有处理多个任务的能力,不一定同时。在短时间内轮流处理多个任务的能力
并行:则是同时处理多个任务的能力
在单个cpu中并发是间隔执行,但是在多核cpu中并发,可以分配到不同的程序执行,实现并行也就是同时执行
并发在一定条件下(多CPU操作系统)可以部分事件并行执行
并发:同一时刻多个线程在访问同一个资源,多个线程对一个点·
例子∶春运抢票电商秒杀....
并行:多项工作一起执行,之后再汇总,
例子:泡方便面,电水壶烧水,一边撕调料倒入桶中。
补充:并发是把任务在不同的时间点交给处理器处理。不一定在同一个时间点处理,cpu来回切换执行
并行则是两个或两个以上的同时发生(执行)
并发:是有处理多个任务的能力,不一定同时。在短时间内轮流处理多个任务的能力
并行:则是同时处理多个任务的能力
在单个cpu中并发是间隔执行,但是在多核cpu中并发,可以分配到不同的程序执行,实现并行也就是同时执行
并发在一定条件下(多CPU操作系统)可以部分事件并行执行
管程(Monitor 监视器)
锁
是一种同步机制,保证同一个时间,只有一个线程访问被保护数据或则代码
是一种同步机制,保证同一个时间,只有一个线程访问被保护数据或则代码
用户线程和守护线程
用户线程:自定义线程
主线程结束了,用户线程还运行 jvm存活
守护线程:比如垃圾回收
没有用户线程了,都是守护线程,jvm结束
2、Lock接口
Synchronized
修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;。
修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象﹔·
修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象
修改一个类,其作用的范围是synchronized 后面括号括起来的部分,作用主的对象是这个类的所有对象。·
synchronized实现售票
多线程编程步骤
第一步 创建资源类,在资源类创建属性和操作方法
第二部 在资源类操作方法
判断(等待线程释放锁)
干活(业务实现的地方)
通知(通知其他线程)
第三步 创建多个线程,调用资源类的操作方法
第四步防止虚假唤醒
什么是Lock接口
Lock锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。Lock提供了比 synchronized更多的功能。·
创建线程的多种方式
继承Thread类
实现Runnable
使用Clallable接口
使用线程池
使用Lock实现买票例子
Lock和Synchronized的区别
Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized 代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象
. Lock不是Java语言内置的,synchrogized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这个类可以实现同步访问;。
Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized 代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象
synchronized线程执行发生异常,此时JVM会让线程自动释放锁。
3、线程间通信
使用volatile关键字
使用Object类的wait()和notify方法
wait
虚假唤醒
使用JUC工具类CountDownLatch
Lock的Condition
4、线程间定制化通信
建立标志位flag
5、集合的线程安全
集合线程不安全演示
解决方案-Vector
解决方案-Collections
解决方案-CopyOnWriteArrayList
Hashset
解决方案-CopyOnWriteArrayList
HashMap
解决CurrentHashMap
6、多线程锁
synchronized锁的八种用法
公平锁非公平锁
非公平锁
ReentrantLock默认的 或着false非
线程饿死 效率高
公平锁
ReentrantLock(true)
效率低但是都会有(阳光普照)
可重入锁
死锁
7、Callable接口
futuretask(未来任务)
8、JUC强大的辅助类
减少计数CountDownLatch
循环栅栏CyclicBarrier
信号灯Semaphore
9、ReentrantReadWriteLock读写锁
10、BlockingQueue阻塞队列
11、ThreadPool线程池
12、Fork/Join分支合并框架
13、CompletableFuture异步回调
0 条评论
下一页