多线程编程得企业级套路+模板
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设计的目的就是为了能够在当前线程中有属于自己的变量,并不是为了解决并发或者共享变量的问题
-
每个Thread维护着一个ThreadLocalMap的引用
-
ThreadLocalMap是ThreadLocal的内部类,用Entry来进行存储
-
调用ThreadLocal的set()方法时,实际上就是往ThreadLocalMap设置值,key是ThreadLocal对象,值是传递进来的对象
-
调用ThreadLocal的get()方法时,实际上就是往ThreadLocalMap获取值,key是ThreadLocal对象
-
ThreadLocal本身并不存储值,它只是作为一个key来让线程从ThreadLocalMap获取value。
正因为这个原理,所以ThreadLocal能够实现“数据隔离”,获取当前线程的局部变量值,不受其他线程影响~
我们来看一下ThreadLocal的对象关系引用图:
ThreadLocal内存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一样长,如果没有手动删除对应key就会导致内存泄漏,而不是因为弱引用。
想要避免内存泄露就要手动remove()掉!
写给大忙人看的进程和线程
AQS 原理以及 AQS 同步组件总结
CAS、原子操作类的应用与浅析及Java8对其的优化
synchronized的实现原理及锁优化
慌了,面试居然被问到怎么做高并发系统的限流?
如何设置线程池参数?
ThreadLocal面试六连问
生产者消费者模式
面试被问到了 难受 没有回答上来