并发编程JUC
2023-06-07 13:51:56 0 举报
AI智能生成
并发编程JUC
作者其他创作
大纲/内容
JUC是什么
定义
并发编程中使用的工具类
进程/线程回顾
进程/线程的定义
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度
多线程获取的回顾
继承Thread
创建一个继承Thread的子类
重写run方法,执行操作写在run中
创建Thread子类的对象
调用此对象的start()-①启动线程;②调用线程的run方法
实现Runnable接口
创建一个实现Runnable的接口类
实现Runnable接口的抽象方法
创建接口实现类的对象
传入到Thread类的构造器中,创建Thread类对象
调用Thread的start()——Runnable接口的run方法
实现Callable接口
优势
call()方法是可以使用throws的方式处理异常的
call()可以声明返回值
可以使用泛型,指定call()返回值的类型
使用
多线程的执行,需要借助于FutureTask类。
call()方法的执行结果(即:返回值)需要使用FutureTask的get()获取
FutureTask
异步调用
当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态
一般FutureTask多用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果
线程池
对比
实现Runnable方式优于继承Thread方式
Java类的单继承性的局限性;
实现Runnable接口的方式更适合处理多个线程有共享数据的问题
共同点
继承的方式、实现的方式都是重写Runnable中的run方法,调用start启动线程
Lock接口
Synchronized回顾(线程安全问题)
同步代码块
代码示例
synchronized(同步监视器){
//需要被同步的代码
}
说明
1.需要被同步的代码,操作共享数据的代码
2.共享数据:多个线程共同操作的数据,比如,ticket;
3.同步监视器,俗称锁。要求:①任何一个类的对象都可以充当同步监视器;②多个线程必须共用同一个同步监视器
同步方法
如果操作共享数据的代码,完整的声明在了某一个方法内,我们可以考虑将此方法声明为公共方法
非静态的方法,如果声明为同步方法,此时默认的同步监视器是this
静态方法,如果声明为同步方法,此时默认的同步监视器是,当前类本身
Lock
JDK5.0新增
使用Lock锁方式,解决实现问题中的线程安全问题
synchronized与Lock锁的区别
1)synchronized涉及到同步监视器,要求多个线程共用唯一的同步监视器
当执行语句结束synchronized对应的一对{}以后,会自动的释放同步监视器,使得其他线程可以操作共享数据
2)Lock锁,提供具体的Lock锁的实现类对象,此对象需要多个线程共享
必须手动调用unlock()方法,才能结束对共享数据的操作,使得其他线程可以操作共享数据
线程间通信
基本回顾
wait及notify
wait() : 一旦执行wait,就使当前线程进入阻塞状态,并释放同步监视器
notify() : 唤醒被 wait()的一个线程
notifyAll():唤醒被wait()的所有线程
说明
1.wait()、notify()、notifyAll()三个方法的调用者是同步监视器
如果不是,则报错,错误类型IllegalMonitorStateException
2.因而他们只能用于同步方法和同步代码块中
3.这三个方法定义于object类中
sleep与wait的异同
分支主题
概述
sleep让当前线程睡眠指定秒数
wait直接进入阻塞
相同点
都让线程进入阻塞状态
不同点
同步代码块或同步方法中
sleep不释放同步监视器,wait释放同步监视器
定义方法所属的结构
sleep是Thread,静态方法,wait是Object,非静态的方法
结束阻塞的时机不同
sleep时间到自动执行,wait需要notify
使用的范围不同
wait只能在同步代码块中使用
lock实现通信,可通过lock创建Condition对象
什么是分布式锁
当在分布式模型下,数据只有一份(或有限制),此时需要利用锁的技术控制某一时刻修改数据的进程数。分布式锁可以将标记存在内存,只是该内存不是某个进程分配的内存而是公共内存,如 Redis,通过set (key,value,nx,px,timeout)方法添加分布式锁。
什么是分布式事务
分布式事务指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。
0 条评论
下一页