面向对象
时间 2022-11-5
地点 SZ
人物 synchronized 和 single
废话不多说,snychronized 是java同步的机制修饰词
single 其实就是抽象的单例模式
OK,那么他们是怎么走到一起的?值得我们八卦一下
single 也就是单例,实现单例的方式有多少种?
有多少种我不知道,常用的就四种(以下均为伪代码,具体实现自己百度一下,或者看这里)
(由于经常Kt和Java混编,所以有些伪代码看起来会很像缝合怪,见怪不怪)
1、懒汉式
- class Single{
- private Single mSingle;
-
- fun Single getInstance(){
- if (mSingle == null) {
- mSingle = new Single()
- }
- return mSingle;
- }
-
- }
2.线程安全懒汉式(也就是懒汉被警察看住,不能随便乱搞 滑稽.gif)
- class Single{
- private Single mSingle;
-
- fun synchronized Single getInstance(){
- if (mSingle == null) {
- mSingle = new Single()
- }
- return mSingle;
- }
-
- }
也就是在获取的方法上加了一个警察snychronized 防止乱搞
3、饿汉式
- class Single{
- private static final Single mSingle = new Single()
-
- fun getInstance():Single{
- mSingle
- }
-
- }
也就是说一个很饿的人看到这个东西就吃/用,他不管你里边是不是空值, em.....上边这种说法有点抽象,还是看代码说吧,就是类里边已经创建好了一个该对象实例直接返回就行了
4、枚举式单例(也有人称他为登记式单例)
- class Single{
-
- public Single getInstance(){
- return SingleInner.single
- }
-
- private static class SingleInner{
- private static Single single = new Single()
- }
-
- }
5、双重锁检查单例
- class Single{
- private volatile static Single instance;
-
- private Single(){
-
- }
-
- public static Single getInstance(){
- if (instance == null) {
- synchronized(Single.class){
- if (instance == null) {
- instance = new Single()
- }
- }
- }
- return instance
- }
-
-
- }
注意这里的修饰词 volatile ,volatile 其实跟synchronized 是两兄弟,都是Java 同步代码块使用的
这里就加了两重锁了,其实就是一个警察看不住这个懒汉式又加了一个高职位的警察,线程懒汉式的升级版.
OK,单例模式介绍完了,现在来说说synchronized (中文发音 "醒客了nice" emoj.gif)为什么要赖上单身狗Single
synchronized 其实Java 中用来同步代码属性的,em.......这么说有点抽象,就是说一个方法或者一个类的属性可能会出现同一时刻同时被两个做互斥事件的线程拿来修改.
OK问题来,这两线程做的事情是互斥的,什么是互斥,也就是说一个苹果要么你拿要么他拿,这中间cpu没人管的话,谁来分这苹果到底谁拿?或者他两把这个方法和类属性一人一半?开什么玩笑,你见过半个苹果而已,你见过半个方法或者属性的吗? 狗头.jpg
于是synchronized 就是cpu创造出来分谁先欣赏和雕刻钻石苹果的,当两个互斥事件的线程同时来拿这个方法或者类属性的时候就先随机分配一个线程,另一个线程就把他拦住不让他接近这个方法或者类属性并告知他等一会拿到苹果(方法/类属性)的线程欣赏完(处理完)后我再给你一个修改后的钻石苹果让你去欣赏和修改.
OK,synchronized 和 single的故事基本抽象讲完了,现在来讲讲 synchronized 的 class 和 this的区别
class 代表synchronized 锁的是类
this 代表synchronized 锁的是对象
那 synchronized 静态方法和非静态方法呢,其实就类比一下就行了(有点困节省点字数.png),
静态方法 类似于 class
非静态方法 类似于 this
当使用 class 进行加锁 synchronized 时每当线程进入都会被snychronized 进行分配与等待
当使用this 进行加锁synchronized 时这个要看情况,
如果这两个线程调用的对this是同一个的话就会进行分配与等待,如果是不同的this调用到synchronized修饰的方法/类属性时这两线程是同步进行的,相关运行效果看这里done