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方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。

      

    
    
  • 相关阅读:
    模板 无源汇上下界可行流 loj115
    ICPC2018JiaozuoE Resistors in Parallel 高精度 数论
    hdu 2255 奔小康赚大钱 最佳匹配 KM算法
    ICPC2018Beijing 现场赛D Frog and Portal 构造
    codeforce 1175E Minimal Segment Cover ST表 倍增思想
    ICPC2018Jiaozuo 现场赛H Can You Solve the Harder Problem? 后缀数组 树上差分 ST表 口胡题解
    luogu P1966 火柴排队 树状数组 逆序对 离散化
    luogu P1970 花匠 贪心
    luogu P1967 货车运输 最大生成树 倍增LCA
    luogu P1315 观光公交 贪心
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/9729760.html
Copyright © 2011-2022 走看看