作者:mobiledu2502855247 | 来源:互联网 | 2023-10-13 11:06
警醒自己不断学习和成长
正式学习的准备工作
JUC并发编程
1.什么是JUC
JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK 1.5开始出现的。
2.进程和线程回顾
什么是进程和线程?
进程:是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用,例如:QQ.exe
线程:是拥有资源和独立运行的最小单位,也是程序执行的最小单位.
一个进程可以包含多个线程,一个进程至少有一个线程!Java程序至少有两个线程:GC,main
并发、并行
并发:多个线程操作同一个资源,交替执行的过程!
并行:多个线程同时执行!只有在多核CPU下才能完成!
使用多线程或者并发编程的目的:提高效率,让CPU一直工作,达到最高处理性能!
线程有几种状态
线程有6种状态
public enum State {
Java不能够创建线程!!!(线程是操作系统的资源)
线程的状态切换
wait/sleep的区别
1、类不同!
wait——Object类 sleep——Thread类
在juc编程中,线程休眠怎么实现?
//时间单位
TimeUnit.SECONDS.sleep(3);
?
2、会不会释放资源
sleep:抱着锁睡得,不会释放锁;wait会释放锁。
3、使用的范围是不同的
wait和notify是一组,一般在线程通信的时候使用;
sleep就是一个单独的方法,在哪里都可以调用。
4、关于异常
sleep需要捕获异常
3.Lock锁
synchronized 传统的方式
代码:
package com.rudd.demo;
?
import java.util.concurrent.TimeUnit;
?
Lock锁
代码:
package com.rudd.demo;
?
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
?
public class Test02 {
?
public static void main(String[] args) {
synchronized和Lock的区别
synchronized是一个关键字;Lock是一个对象
synchronized无法尝试获取锁,Lock可以尝试获取锁,会进行判断;
synchronized会自动释放锁(a线程执行完毕,b如果异常了,也会释放锁),Lock锁是手动释放锁,如果不释放就会死锁。
synchronizedsynchronizedsynchronized(线程A(获得锁,如果阻塞),线程B(等待,一直等待));Lock可以尝试获取锁,失败了之后就放弃。
synchronized一定是非公平的锁,但是Lock锁可以是公平的,通过参数设置;
代码量特别大的时候,我们一般使用Lock实现精准控制,synchronized适合代码量较小的同步问题。
4.生产者和消费者
线程和线程之间本来是不能通信的,但是有时候我们需要线程之间可以协调操作:等待唤醒机制
synchronized
package com.rudd.demo;