1,并发与并行
并发---线程之间相互切换执行
并行---线程之间齐头并进,主要体现在多处理器的环境下
2。thread实例与创建的线程之间的关系
属于两个部门,即使线程结束了,实例依然存在。主程序结束的时,并不代表创建的线程也结束,如main方法
3。 Thread.sleep(2000),让当前线程休眠2秒,捕捉Interrupted exception
4。synchronized
synchronized 加在方法上,等同于 synchronized (this) {}//阻挡,作用于实例的这个方法,多个实例之间无任何影响
static synchronized ---类方法锁定,等同于synchronized (A.class) {}//阻挡,锁定这个类A,实例之间互斥,当前只有一个类在操作
5. thread-safe 线程安全
可容一个以上线程使用,而不危及安全性的类称为 thread-safe类。
常用的举例,java.util.Vector是线程安全的,java.util.ArrayList不是,所以在使用ArrayList的时候要使用synchronized来锁定,还有MAP,SET都是不安全的,都需要使用synchronized类构建安全的变量
6。多线程程序设计应遵循的原则
保证程序的安全性和生存性
7。使用synchronized会提高程序的效率吗?为什么?该如何解决?
原因:1。线程获取锁时需要消耗时间,2,线程冲突时,线程等待锁的释放需要时间,导致性能下降。
解决:尽可能减小程序锁定的范围,使用synchronized块
8。定义变量的时候需要注意的问题,防止出现线程不安全,造成值的改变
基本数据类型,引用类型是原子的,不会出现值(地址)被分割的情况,
但是在线程间共享long,double类型需在声明前加volatile关键字,让他作为一个整体
9.设计一个immutable(不变) ,安全的类
首先将类声明成final,则禁止子类继承,修改类的属性;
类的字段只有get方法,去除set方法,且为属性赋值时,只使用类的有参构造器;
同时将属性声明为final类型,保证通过构造器赋值之后又,再不允许修改。
好处:避免使用synchronized,提高程序效率
适用:适用于多个线程之间共享实例的时候
10. 使用wait(),notify()方法时必须保证实例是被所定的,即使用synchronized关键字
11 wait(),sleep(),yield()区别,哪个是Object的方法,哪个Thread的方法
wait是Object类的方法,sleep与yield都是Thread类的方法。wait调用的时候需要注意的是该方法是释放锁标志的, 而sleep在调用的时候是紧紧抱着锁标志的,也就是等他完全执行完成了才可以让其他线程来访问的。
sleep 方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield 方法使当前
线程让出 CPU 占有权,但让出的时间是不可设定的。实际上,yield()方法对应了如下操作: 先检测当前是否有比当前线程优先级别高的线程,如有,则把 CPU 的占有权交给此线程,否则,继续运行原来的线程。所以yield()方法称为“退
让”,它把运行机会让给了同等优先级的其他线程。
转载自:https://www.aliyun.com/jiaocheng/240204.html?spm=5176.100033.9.5.M5mDcD