首页 > 大数据 > 数据挖掘 > 好程序员大数据学习路线分享多线程学习笔记
好程序员大数据学习路线分享 多线程 学习笔记, 默认情况下, 主线程和垃圾回收线程都是由系统创建的 , 但是我们需要完成自己的功能 ---- 创建自己的线程对象 。
* java 将线程面向对象了 , 形成的类就是 Thread, 在 Thread 类内部执行任务的方法叫 run()
*
* 注意 : 如果想让 run 作为任务区 , 必须让他去被自动调用 . 我们通过执行 start() 方法 , 来开启线程 , 继而实现 run 方法的自动调用 .
## 直接使用 Thread 创建线程对象
// // 分析 : 由于我们实现的实际功能 Thread 类是决定不了的 , 所以没有办法将我们的功能放入 Thread 的 run 方法里
// // 所以 Thread 的 run 方法是一个空方法 . 如果我们想实现自己的功能 , 可以写 Thread 类的子类 , 重写 run 方法
当我们手动调用run 的时候 , 他失去了任务区的功能 , 变成了一个普通的方法 .
// 当 run 作为一个普通方法时 , 内部对应的线程跟调用他的位置保持一致 .
## 锁的条件 :
* 1. 锁必须是对象 普通的对象 /this/ 字节码文件
* 2. 要被所有的线程共享
*
* 注意 : 字节码文件的使用范围太大 , 一般不建议使用 .
空唤醒
## Lock 锁
使用步骤
1. 创建 ReentrantLock lock = new ReentrantLock(); 对象,需要注意的是多个线程必须使用同一个
2. 把之前的 synchronized( 锁 ){ 用 lock.lock() 替换
3. 把 } 用 lock.unlock(); 替换
好处
1. 不要考虑锁对象
2. 代码看起来更加简洁了
3. 可以使用 try..catch..finaly 把 lock.unlock 放到 finaly 中,好处是如果该线程发生了异常,照样可以释放锁
## 比较 synchronized 和 Lock
* 1.synchronized: 从 jdk1.0 就开始使用的同步方法 - 称为隐式同步
* synchronized( 锁对象 )
* {// 获取锁 我们将锁还可以称为锁旗舰或者监听器
同步的代码}// 释放锁
* 2.Lock: 从 jdk1.5 开始使用的同步方法 - 称为显示同步
* 原理 :Lock 本身是接口 , 要通过他的子类创建对象干活儿
* 使用过程 :
* 首先调用 lock() 方法获取锁
* 进行同步的代码块儿
* 使用 unlock() 方法释放锁
* 使用的场景 :
* 当进行多生产者多消费者的功能时 , 使用 Lock, 其他的都使用 synchronized
* 使用效率上 :Lock 高于 synchronized
## 多线程的单例
// 饿汉式 , 由于公共方法中只有一行公共的代码 , 所以不会产生线程安全问题
class SingleInstance1{
private static final SingleInstance1 s = new SingleInstance1();
private SingleInstance1() {
}
public static SingleInstance1 getInstance() {
return s;
}
}
// 懒汉式 ,
class SingleInstance2{
private static SingleInstance2 s = null;
private SingleInstance2() {
}
public static SingleInstance2 getInstance() {
if (s == null) {// 尽量减少线程安全代码的判断次数 , 提高效率
synchronized (SingleInstance2.class) {// 使用同步代码块儿实现了线程安全
if (s == null) {
s = new SingleInstance2();
}
}
}
return s;
}
## 线程停止
1. 通过一个标识结束线程
2. 调用 stop 方法 --- 因为有固有的安全问题 , 所以系统不建议使用 .
3. 调用 interrupt 方法 ---- 如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69913892/viewspace-2658533/ ,如需转载,请注明出处,否则将追究法律责任。