当前位置: 首页 / 技术干货 / 正文
好程序员大数据学习路线分享多线程学习笔记

2019-12-23

BigData 大数据培训 好程序员

好程序员大数据培训分享多线程学习笔记,默认情况下,主线程和垃圾回收线程都是由系统创建的,但是我们需要完成自己的功能----创建自己的线程对象。
* 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 方法来中断该等待。

好程序员开班动态

More+
  • HTML5大前端 <高端班>

    开班时间:2020-07-20(深圳)

    开班盛况

    开班时间:2020-08-17(深圳)

    预约报名
  • 大数据+人工智能 <高端班>

    开班时间:2020-08-10(深圳)

    开班盛况

    开班时间:2020-09-14(北京)

    预约报名
  • JavaEE分布式开发 <高端班>

    开班时间:2020-06-22(上海)

    开班盛况

    开班时间:2020-07-20(上海)

    开班盛况
  • Python人工智能+数据分析 <高端班>

    开班时间:2020-07-20(上海)

    开班盛况

    开班时间:2020-09-14(上海)

    预约报名
  • 云计算开发 <高端班>

    开班时间:2019-07-22(北京)

    开班盛况

    开班时间:2019-07-15(深圳)

    开班盛况
在线咨询
免费试听
入学教程
立即报名

Copyright 2011-2020 北京千锋互联科技有限公司 .All Right 京ICP备12003911号-5 京公安网11010802011455号