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面试六连问

生产者消费者模式   

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

 

posted @ 2020-03-22 16:41  doyi  阅读(276)  评论(0编辑  收藏  举报