java-异步与并发之基础

1.线程提供了一个方法:
void join()该方法允许一个线程在另一个线程上等待,直到其完成工作后才解除阻塞运行。所以join可以协调线程之间同步运行线程调用join()方法,方法后就进入阻塞状态。
2. 同步与异步:
同步运行指代码运行是有先后顺序的执行
异步运行指代码与代码间是“各干各的”互不影响
多线程并发是异步运行代码的,但是有时候又需要这些线程间的同步运行时可以使用join完成线程间的同步。
3.当一个方法的局部内部类中想引用这个方法的其他局部变量,那么该局部变量必须是final的,这是由于jvm内存分配问题,java8以后没有这个问题
4.多线程并发安全问题由于线程之间运行的是异步的,互相没有牵制,如果同时访问统一资源时就会出现“抢”的现象,由于线程发生切换现象的实际不确定性导致代码执行顺序可能未按照设计的顺序执行,出现一系列的不可预知的错误。
5.当一个方法被synchronized修饰后,该方法称为同步方法,即:多个线程不会同时对beans这个数据进行操作没有抢的问题,就不会出现并发安全问题了
在一个方法上使用synchronized修饰,那么同步监视器对象是该方法所属对象,即方法内部看到的this。
6.有效的缩小同步范围可以在保证并发安全的前提下尽可能提高并发效率:
同步块可以更精确的指定需要同步的代码片段。若希望多个线程同步执行里面的代码,就需要在同步块中指定的“同步监视器(即:)上锁对象”
必须是同一个才可以。这里由于t1,t2调用的是同一个shop的buy方法,所以这里两个线程看到的this都是这个shop对象那么这个同步块就具有了同步效果。
7.静态方法使用synchronized修饰后,该方法一定具有同步效果:
静态方法上使用synchronized修饰后,同步监视器对象是当前类的类对象。jvm在加载每个类的时候,都会实例化一个且只实例化一个class的实力用来描述这个类,而静态方法锁的就是这个对象。
8. 互斥锁:synchronized修饰不同的代码,当同步监视器对象是相同的时候这些代码片段之间就是互斥的。多个线程不能同时进到这些代码片段中一起执行。
9.使用集合工具类java.util.Collections的相关静态方法可以将现有集合或Map转换为线程安全的
synchronizedList、synchronizedSet、synchronizedMap
哪怕是线程安全的集合也不与迭代器遍历该集合互斥,所以在开发时要自行维护互斥关系。
10.线程池:线程池主要解决两个问题:
1:控制线程数量:每条线程都需要占用一部分内存,线程数量越多占用内存资源越多,并且线程多了以后CPU轮询时间会变长形成CPU过度切换,这些都会导致系统变慢,甚至瘫痪。
2:重用线程:频繁创建销毁线程也会给线程调度带来负担。尽量重用线程。减小系统开销。
当一个正在阻塞的线程被中断时,会抛出中断异常InterruptedException
shutdown()和shutdownNow():前者调用完毕后线程池不在接受新任务并且会将池中剩余任务执行完毕后自行停止。后者调用后线程池会强制中断线程池中所有线程并立即停止线程池。

我是初学者,如有更新不好的,欢迎这位大神指出,谢谢大家!

更多精彩以后更新,转载注明!

原文地址:https://www.cnblogs.com/CaiNiao-TuFei/p/7476035.html