zoukankan      html  css  js  c++  java
  • 多线程笔记

      现如今,笔记本、台式机、服务器,一般都是多核CPU,如果是单线程的话,在双核CPU上,相当于浪费了50%,所以多线程才能发挥多个CPU的优势。

      从任务管理器中,性能中我们能够看到计算的CPU数量和线程数,win7 下有几个黑框就是几个线程,并不一定是CPU数量,win10 下,内核就是数量数,逻辑处理器就是线程数。

      并发和并行: 并发和并行都可以表示两个或者多个任务一块执行,但是侧重点不同,并发侧重点是多个任务交替执行,并行才是真正的 同时执行。 

      使用多线程技术后,可以在同一时间运行更多不同种类的任务。

      **********************切记 出现多线程后,多线程以后的部分,将不会遵循顺序执行的原则*********************************

      在没有进行正确同步下,如果多个线程访问同一个变量,你的程序需要注意3中隐患,具体修复的方法如下(

      1.不要跨线程共享变量

      2.使状态变为不可变化的

      3.在任何状态下访问变量的时候,都使用同步

      4.为了解决这个问题,所以一开始就将一个类设计成线程安全的,方便后期的维护

      )

      1.线程的安全性;如果一个类可以安全的被多个线程使用,那么他就是安全的.

      2.无状态的对象永远是安全的

      3.每个共享的可变变量都需要由唯一一个确定的锁保护,而维护者应该清楚这个锁

      4.每一个涉及多个变量的不变约束,需要同一个锁来保护所有的变量。

      5.有些耗时的计算和操作,比如网络或者控制台的I/O,难以快速完成时,执行这些操作期间不要占用锁。(如果线程长时间占用锁的话,就会引起性能和活跃度的风险)。

      6.尽量将变量设置成final 类型。

      7.在使用多线程的情况下,代码的执行结果与代码的执行顺序是没有关系的。

      8.执行start()的顺序,不代表线程启动的顺序。

      9.isAlive() 判断线程是否处于激活状态,如果线程运行结束之后,它的状态就是false。

      10.sleep() 表示当前的线程休眠指定的时间。Thread.sleep(1000)。

      11.getId() 表示取得线程的唯一标识。

      12.线程的终止Thread.stop()、Thread.interrupt(),建议使用后者,stop为暴力停止,可能会使一些清理性的工作得不到完成。

      13.this.interrupted() 测试当前线程是否已经关闭,它具有擦除状态标识的功能,第一次的值和第二次的值是不相同的。

      14.this.isInterrupted() 测试线程是否已经中断,不会清楚状态标识的功能。

      15.可以使用上面这两个进行线程的停止。

      16.将方法interrupt()和return 结合使用,也能实现线程停止的效果。

      17.建议使用抛异常的方法,可以将异常往上抛,使线程停止的事件得以传播。

      18.线程的暂停使用suspend(),resume() 线程的恢复。

      19.线程的暂停在使用上面这两种方法的时候,如果使用不当,极易造成公共的同步对象的独占,使其他线程无法访问公共同步对象,(同步后,一个线程暂停,在锁的范围                 内,另外的线程也不能进入)。

      20. 使用上面那两个方法,可能会导致数据不同步的情况。

      21.yield() 方法的作用是,放弃当前的CPU资源,但放弃的时间不确定。

      22.线程的优先级分为10个等级1-10,使用setPriority() 方法来设置优先级,优先级具有不确定性,一般来说,优先级高的运行得快。

      23.java中有两种线程,一种是用户线程、一种是守护线程。守护线程最典型的就是垃圾回收器。

      24.如果是线程内部的私有变量,则不存在"非线程安全"问题,所得的结果都是线程安全的。

      25.如果多个线程共同访问一个对象中的实例,则运行的结果可能会出现交叉的情况。

      26.解决上面这个问题,需要在上面的方法前面加上一个synchronized 即可。

      27.当一个线程执行的代码出现异常时,其所持有的锁会自动释放。

      28.同步不具备继承性。

      29.如果多个线程访问多个对象,则虚拟机会创建多个锁,同步的单词为synchronized ,异步的单词为asynchronized。

      30.调用synchronized 时的方法一定是排队运行的。只有共享的资源才需要同步化,如果不是共享资源,那么根本就没有同步的必要。

      31.使用synchronized 的时候,再取值的时候,也有可能出现意想不到的情况,脏数据的读取,发生在读取实例变量的时候,此值已经被其他线程更改过了。

      32.synchronized 锁可重入,也就是锁中也可以带锁。如果不可重入的话,可能就会造成死锁,也支持父子类继承的关系。

      33.不在synchronized块中的就是异步执行,在synchronized块中的就是同步操作。

      34.synchronzied(this) 锁的是当前对象。

      35.关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。

      36.volatile 具有非原子性,不具备同步性。它的作用场合主要是在多个线程中可以感知实例变量被更改,并且获得最新的值进行使用,它提示线程每次从共享内存中读取变量,

       而不是从私有内存中读取,这样就保证了同步数据的可见性。它本身并不处理数据的原子性,而是强制对数据的读写及时影响到主内存中。

      37.为了减少多线程while语句轮询消耗CPU资源,可以采用wait notify 机制进行。轮询的时间小,更浪费资源,轮询的时间大,有可能取不到想要的资源。等待和通知机制。

      38.方法wait() 的作用是使当前执行代码的线程进行等待。该方法是用来将当前线程置于 预执行队列 中,并且在wait所在代码处停止执行,直到接到通知或者中段之后为止。

      39.在执行notify方法之后,当前线程不会马上释放该对象锁,wait线程也不会马上获取该对象锁,要等到notify方法的线程将程序执行完毕,也就是退出时才能释放锁。

      40.线程的等待wait需要加入同步锁。

      41.当方法wait被执行后,锁被自动释放,但执行完notify后锁不能自动释放,只有执行完notify 方法所在的同步代码块后才能释放锁。

      42.当线程是wait状态时,调用线程对象的interrupt 方法时,会出现异常情况。

      43.调用notify 时,一次只随机通知一个线程进行唤醒。

      44.唤醒全部的线程,可以使用notifyAll。

      45.wait(long) 是等待多长时间后,自动进行唤醒。

      46.使用生产者向堆栈List对象中放入数据,使用消费者从List堆栈中读取数据。

      47.join 方法的作用是等待线程对象销毁。比如:子线程在处理一个数据,主线程要取到这个数据,就需要用到join。

      48.join 方法的作用是使线程执行完之后,再执行。join在内部使用的是wait方法进行等待,而sychronized 关键字使用的是 对象监视器 原理进行同步的。

      49.在join 过程中,如果当前线程对象被中断,则当前线程会出现异常。

      50.join(long)是设定等待的时间,它的内部使用的是wait 的原理,具有释放锁的特点。

      51.ThreadLocal 主要解决的就是每一个线程绑定自己的值,即使多个线程往都想同一个ThreadLocal  对象中加入值,但是每一个线程只能取出自己的值

      52. InheritableThreadLocal 可以让子线程从父线程中取值。注意是线程而不是类。

      53.Thread.sleep(0)的作用是什么 ,平衡cpu分配资源

      54.自旋锁是一种锁操作里面用的时间特别短,减少上下文的切换。就是执行一个循环,等待。

      55.阻塞锁就是常用的synchronized 或者Object.wait() otify()

      56.可重入锁 同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响

      57.悲观锁  就是在查询数据的时候,先上锁。

      58.乐观锁,就是在查询的时候,先不上锁,等到数据库更新的时候,检测数据是否被改变。

      59.Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。

      

    
    
  • 相关阅读:
    PHP无限极分类
    MySQL批量插入测试数据
    MySQL常见面试知识点汇总
    小程序交易组件-自定义交易组件相关知识
    Matplotlib
    sklearn之计算回归模型的四大评价指标(explained_variance_score、mean_absolute_error、mean_squared_error、r2_score)
    pandas.core.frame.DataFrame 切片技巧
    Pyspider all 出现的坑
    mysql 问题
    爬虫遇到HTTP Error 403的问题
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/9729760.html
Copyright © 2011-2022 走看看