ITPub博客

首页 > 大数据 > 数据挖掘 > 好程序员大数据学习路线分享多线程学习笔记

好程序员大数据学习路线分享多线程学习笔记

原创 数据挖掘 作者:好程序员IT 时间:2019-09-27 16:48:56 0 删除 编辑

  好程序员大数据学习路线分享 多线程 学习笔记, 默认情况下, 主线程和垃圾回收线程都是由系统创建的 , 但是我们需要完成自己的功能 ---- 创建自己的线程对象 。

 

 * 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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
欢迎关注公众号:好程序员特训营 web前端教程分享 723729549 大数据教程分享 703503210

注册时间:2019-03-20

  • 博文量
    539
  • 访问量
    410781