zoukankan      html  css  js  c++  java
  • JUC(1)

    多线程编程得企业级套路+模板

    1 在高内聚低耦合得前提下:线程        操纵(对外暴露得调用方法)      资源类

    Thead.currentThread().getName();

    new 接口的语法叫匿名内部类

    .start代表就绪 不代表立刻马上启动  线程的调度要等待操作系统,有一个优先级得排序和阻塞

    接口中得默认方法和静态方法可以有很多个,默认方法直接使用实例来调用,静态方法用类名来调用。但是非静态和非默认方法若想使用函数式接口只能有一个。

     

     在多线程交互中,wait()可能会导致虚假唤醒,因此应该在while循环中使用wait而不是用if

     java多线程口诀

     

    Lock

    新得方法中用Lock取代Synchronized 用Condition取代Object monitor methods(wait notify notifyall)

    lock.newCondition()

    lock得新方法在下面:

     

    一个示例如下下:

     

    精确通知顺序访问:(注意最后一个口诀 注意标志位得修改和定位)

     

     

      print15与上面两个类似,调用方法如下所示:

    wait和notyfy的方法如下:打印0-100 1和2线程交替打印

    Java8以后新得睡觉工具:

     

    8锁问题

    1. 标准访问,请问先打印邮件还是短信(两个打印方法均被synchronized修斯):邮件   

    2.邮件方法暂停4秒,请问先打印邮件还是短信:邮件   

    3.新增一个普通的方法(没有被synchronized修饰),先打印邮件还是短信:先打印hello

    4.两部手机,请问先打印邮件还是短信:短信

    5.两个静态同步方法,同一部手机,请问先打印邮件还是短信:邮件

    (静态同步方法:static synchronized相当于synchronized(this.getClass()))没有static的叫做普通同步方法

    所有非静态同步方法用的都是同一把锁-----实例对象本身

    6.两个静态同步方法,2部手机,请问先打印邮件还是短信:邮件

    7.一个普通同步方法(SMS),一个静态同步方法(EMAIL),1部手机,请问先打印邮件还是短信:短信

    8.一个普通同步方法(SMS),一个静态同步方法(EMAIL),2部手机,请问先打印邮件还是短信:短信

    普通同步方法用的是this的锁,静态同步方法用的是class的锁     

     1.synchronized 修饰的代表同一时间内只有一个线程能访问到这个资源类的一个synchronized方法

    #一个对象里面如果有多个synchronized方法,某一个时刻,只要一个线程去调用其中的一个synchronized方法了,其他的线程就都只能等待,换句话说就是某一个时刻内只能有唯一一个线程去访问这些synchronized方法,锁的是当前对象this,被锁定后,其他的线程都不能进入到当前对象的其他的synchonized方法

    2.邮件先抢到锁了

    3.hello不会抢锁     普通方法和同步锁无关

    4.加锁不关键了 井水不犯河水 换成两个对象不是同一把锁了

    5.都换成静态方法  static锁定的是class而不是具体的实例对象

      new this 具体的一部一部的手机

      静态 class  唯一的一部模板

    7.两个锁的对象不一样 所以不冲突

     

     threadlocal

    要记住的是:ThreadLocal设计的目的就是为了能够在当前线程中有属于自己的变量,并不是为了解决并发或者共享变量的问题

    3y

    1. 每个Thread维护着一个ThreadLocalMap的引用

    2. ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储

    3. 调用ThreadLocal的set()方法时,实际上就是往ThreadLocalMap设置值,key是ThreadLocal对象,值是传递进来的对象

    4. 调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象

    5. ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value

    正因为这个原理,所以ThreadLocal能够实现“数据隔离”,获取当前线程的局部变量值,不受其他线程影响~

    我们来看一下ThreadLocal的对象关系引用图:

    ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用

    想要避免内存泄露就要手动remove()掉

    写给大忙人看的进程和线程

    AQS 原理以及 AQS 同步组件总结

    CAS、原子操作类的应用与浅析及Java8对其的优化

    synchronized的实现原理及锁优化

    慌了,面试居然被问到怎么做高并发系统的限流?

    如何设置线程池参数?

    ThreadLocal面试六连问

    生产者消费者模式   

    面试被问到了  难受 没有回答上来

  • 相关阅读:
    零散的学习总结
    JSON学习整理
    轮播图
    关于new Object的小结
    js函数声明和函数表达式的区别
    float小结
    DOM文档加载步骤
    css主要的浏览器兼容性问题
    js for循环小记
    CANVAS中的lineWidth小计
  • 原文地址:https://www.cnblogs.com/doyi111/p/12546838.html
Copyright © 2011-2022 走看看