多线程的相关知识点

本文详细介绍了线程的概念,包括线程与进程的关系,Java中创建线程的三种方式,线程控制(休眠、礼让、合并、中断),同步锁/互斥锁的使用,以及多线程中的原子性、可见性和有序性概念。通过对这些知识点的探讨,帮助读者深入理解Java多线程编程。
摘要由CSDN通过智能技术生成
一、什么是线程,理解线程和进程的关系
线程理解:影分身
线程是进程里面的一条执行路径,每个线程同享进程里面的内存空间和系统资源
一个进程 -- 多线程:各个线程都有不同的分工

进程:进程之间的内存空间和系统资源是独立的
线程:线程之间是共享内存空间和系统资源的
进程里:可以有一条或一条以上的线程
进程里只有一条线程的情况下,这条线程就叫做主线程
进程里有多条线程的情况下,只有一条线程叫做主线程
Ps:线程是在进程里的,他们是包裹关系
Java中,如何来编写多线程的应用程序?有哪些方法?
创建子线程的方法:
1.创建线程类,继承Thread类,重写run方法
2.创建任务类,实现Runnable接口,实现run方法
3.带有返回值的线程
注意;我们单纯的main方法也不是单线程;因为垃圾回收器也是一个线程奋斗
二、让线程休眠 sleep
注意:sleep方法是静态方法,直接用类名调用,关键是这个方法休眠的是哪个线程?(答:写在哪个线程,就休眠哪个线程)
重要知识点:
sleep -- 休眠
wait --- 等待
这两者从功能上说都是阻塞线程的,唯一的区别是前者休眠不释放锁,后者释放
线程的礼让: Thread. yield ();
正确理解线程的礼让,当前线程释放资源,之后又和其他线程重新争抢资源
注意:yeild方法是静态方法,直接用类名调用,写在哪个线程,哪个线程就礼让
线程的合并: join
主线程和子线程同时运行,满足一定条件后,让子线程先运行至结束
特点:真正能决定最终的结果,和优先级别不同
注意:
线程对象.join() --> 写在哪个线程,就加入到哪个线程
线程的中断
thread .interrupt(); //改变线程中断值
Thread. currentThread ().isInterrupted()// 取反
三、同步锁/互斥锁
重要概念:锁对象,多个线程共用同一把锁,才能锁得住
常用锁对象:this、字面值常量、字节码文件、静态对象
1.1同步代码块
语法:
synchronized(锁对象){//上锁
...代码块...
}//解锁
1.2同步方法
语法:
锁对象:this
public synchronized void method(){//上锁
...代码块...
}//解锁
2.Lock--接口
创建对象:Lock lock = new ReentrantLock();
上锁:lock.lock();
解锁:lock.unlock();
锁的应用:多个线程去操作同个数据时,考虑线程安全(锁)

3.死锁:锁嵌套的时候尤其要小心,要注意
多个线程去争抢多个资源,锁嵌套就容易出现死锁
四、多线程中的原子性、可见性、有序性分别表示什么意思?
原子性(Atomicity):
原子性就是说一个操作不可以被中途cpu暂停然后调度, 即不能被中断, 要不就执行完, 要不就不执行. 如果一个操作是原子性的, 那么在多线程环境下, 就不会出现变量被修改等奇怪的问题


可见性(Visibility):
可见性就是指当一个线程修改了线程共享变量的值,其它线程能够立即得知这个修改。Java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值这种依赖主内存作为传递媒介的方法来实现可见性的,无论是普通变量还是volatile变量都是如此,普通变量与volatile变量的区别是volatile的特殊规则保证了新值能立即同步到主内存,以及每使用前立即从内存刷新。因为我们可以说volatile保证了线程操作时变量的可见性,而普通变量则不能保证这一点。
除了volatile之外,Java还有两个关键字能实现可见性,它们是synchronized。同步块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store和write操作)”这条规则获得的,而final关键字的可见性是指:被final修饰的字段是构造器一旦初始化完成,并且构造器没有把“this”引用传递出去,那么在其它线程中就能看见final字段的值。
(可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就这这个操作同样存在线程安全问题。)


有序性(Ordering):一个线程观察其他线程中的指令执行顺序,由于指令 重排序的存在,该观察结果一般杂乱无序。
Java内存模型中的程序天然有序性可以总结为一句话:如果在本线程内观察,所有操作都是有序的;如果在一个线程中观察另一个线程,所有操作都是无序的。前半句是指“线程内表现为串行语义”,后半句是指“指令重排序”现象和“工作内存中主内存同步延迟”现象。
Java语言提供了volatile和synchronized两个关键字来保证线程之间操作的有序性,volatile关键字本身就包含了禁止指令重排序的语义,而synchronized则是由“一个变量在同一时刻只允许一条线程对其进行lock操作”这条规则来获得的,这个规则决定了持有同一个锁的两个同步块只能串行地进入。


线程池的相关学习请参考: https://jingyan.baidu.com/article/36d6ed1f2db2f11bce488378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值