- 博客(60)
- 收藏
- 关注
原创 最强docker部署模板
docker可以快捷 轻量 高效 简单的部署服务,docker有两个重要概念 镜像(image)与容器(container) 镜像可以理解为类 容器可以理解为对象,假如我们需要部署一个web项目 这个项目由 vue springboot mysql构成,我们就可以先创造所需的镜像,再创造对应的容器 容器之间进行交互 最终实现这个服务。容器与容器之间是相互隔离的 只有身处同一个网络才能交互,一个镜像产生可以由很多容器。
2022-12-25 09:44:53
1715
原创 【面试:并发篇39:多线程:线程池】ThreadPoolExecutor类-提交、停止
注意我们此时把核心线程数设置为3,此时三个任务同时运行,且任务2先运行完可以看到最后的结果只有任务2的返回值,但是注意一个场景,假如我们现在的核心线程数只有一个那么很明显我们的线程会先运行任务1剩下两个任务加入任务队列,等待任务1运行完才会有空闲线程运行剩下的任务,也就是说任务1是先运行完的所以返回的结果只有任务1的返回值。可以看出我们在shutdown后依然可以把shutdown之前的任务运行完毕,但是shutdown之后的任务就没有再运行了。如果有任何问题请指出,感谢。...
2022-07-31 18:53:07
679
原创 【面试:并发篇38:多线程:线程池】ThreadPoolExecutor类的基本概念
ThreadPoolExecutor类实现了ExecutorService接口,他与ScheduledThreadPoolExecutor类的不同是ScheduledThreadPoolExecutor是带有任务调度功能的线程池实现这个我们之后再讲。
2022-07-31 01:27:28
202
原创 【面试:并发篇37:多线程:线程池】自定义线程池
建议学习本文章前最好对生产者消费者模式熟悉,可以看我之前的文章https这个图就是自定义线程池的实现结构,它是用生产者消费者模式实现的,它有三个部分ThreadPool、BlockingQueue、main组成。是线程池它的主要作用是进行线程的创建与任务的执行以及把超过线程池部分的任务交给主线程进行拒绝策略处理,我们可以把线程池中的线程当做消费者。main是任务的生产者,主要作用是任务的生产、线程池的创建、规定拒绝策略、执行拒绝策略。...
2022-07-31 01:25:16
352
原创 【面试:并发篇36:多线程:设计模式】享元模式-应用:自定义连接池
我们现在设想一个场景,假如你有一个网站QPS达到数千,如果每次都重新创建和关闭数据库连接池,性能会受到很大的影响,这时我们预先创建好一批连接,放入连接池。一次请求到达后从连接池获取连接,使用完毕后再还回连接池,这样即节约了连接和关闭的时间,也实现了连接的重用,不至于让庞大的连接数压垮数据库。...
2022-07-31 01:23:29
191
原创 【面试:并发篇35:多线程:设计模式】享元模式
保护性拷贝介绍我之前的一篇文章浅显的模拟过String类当时是为了探究为什么String类是不可变类型文章地址在https里面重要的结论就是因为value数组是final修饰的导致地址引用不可改变所以Sting类的赋值或者获取子类的这种方法其实都是再新new一个对象然后返回,所以String类每次操作后返回的对象都是新的对象所以不可变,大家也可以看一下String类的substring方法保护性拷贝。享元模式介绍。...
2022-07-31 01:21:59
183
原创 【面试:并发篇34:Unsafe】
Unsafe对象提供了非常底层的,操作内存、线程的方法,Unsafe对象不能直接调用,只能通过反射获得,因为Unsafe可以操控底层所以叫这个名字,并不是它线程不安全。
2022-07-29 18:57:31
342
原创 【面试:并发篇33:cas】原子更新器 原子累加器 缓存一致性问题
原子更新器又叫字段更新器,作用是成员变量更新时保证原子性AtomicReferenceFieldUp成员变量为引用类型时AtomicIntegerFiledUpdater成员变量是整型AtomicLongFiledUpdater成员变量是长整型这里拿AtomicReferenceFieldUp举例。...
2022-07-29 18:54:19
251
原创 【面试:并发篇31:多线程:cas】无锁实现并发
cascas可以实现无锁并发,无阻塞并发。cas与synchronized对比CAS是基于乐观锁的思想最乐观的估计,不怕别的线程来修改共享变量,就算改了也没关系,我吃亏点再重试。synchronized是基于悲观锁的思想最悲观的估计,得防着其它线程来修改共享变量,我上了锁你们都别想改,我改完了解开锁,你们才有机会。...
2022-07-29 18:47:24
186
原创 【面试:并发篇30:多线程:happen-before】
happens-before规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛开happens-before规则,JMM并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读是可见的。...
2022-07-29 18:46:21
170
原创 【面试:并发篇29:多线程:volatile】原理
volatile的底层实现原理是内存屏障1.对volatile变量的写指令后会加入写屏障2.对volatile变量的读指令前会加入读屏障。
2022-07-29 18:44:24
218
原创 【面试:并发篇28:volatile】有序性
什么是有序性在不改变程序结果的前提下指令可以在各个阶段通过重排序和组合来实现指令级并行。注意重排序指令不能影响结果为什么这样做cpu处理过程在cpu处理一个指令是包含一系列工序的,包含了取指译码地址生成执行回写,这五步但是这五步之间是可以交错运行的,也就是一个指令译码的时候另一个指令可以取指。例子1x=a;y=b;这样的执行效率显然更加的快,且在语句之间没有关系时执行顺序可以随便,也就是可能先执行y=b再执行x=a,不影响结果例子2x=a;y=b;总结。...
2022-07-27 22:47:10
245
原创 【面试:并发篇27:多线程:犹豫模式】
什么是犹豫模式,指的是一个线程发现另一个线程或者线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。通俗来说就是一个对象只能有效调用一次方法,之后再调用直接返回结束。...
2022-07-26 14:45:13
157
原创 【面试:并发篇24:多线程:综合练习】顺序控制
我们提出两个问题分别用wait/notify,park/unpark,await/signal解决。
2022-07-24 16:56:48
241
原创 【面试:并发篇23:多线程:join】join再理解
昨天我突然想到一个问题join方法的底层实现是wait,执行wait的线程等待,那么它是怎么唤醒的呢?抱着这个问题我找了找博客最后发现了这篇文章https,这里面介绍了notifyAll的解锁时机,我发现了这么一段话在java中,Thread类线程执行完run()方法后,一定会自动执行notifyAll()方法这句话如同醍醐灌顶,我立刻就理解了join方法里的wait是如何唤醒的了。接下来我来模拟一下join的过程。...
2022-07-24 16:54:33
225
原创 【面试:并发篇22多线程:ReentrantLock】
RennttrantLock也是锁和synchronized一样具有锁定同步代码块的作用,不过和synchronized还是有很多不一样的地方。RennttrantLock是下的一个类,相对于synchronized它具备如下特点1.可以打断处于BLOCKED状态的其他线程2.可以设置处于BLOCKED状态的线程超时时间,如果超过这个时间就放弃争抢锁3.可以设置为公平锁,线程按照先入先出获取锁。...
2022-07-23 12:56:42
358
原创 【面试:并发篇21:多线程:活跃性】死锁、活锁、饥饿
死锁两个线程t1t2,两把锁AB,t1持有A锁t2持有B锁,此时t1想要再获得B锁t2想要再获得A锁,但是它们都不释放自己所持有的锁,最终导致死锁。活锁两个线程互相改变对方的结束条件,导致最后谁也没办法结束饥饿多个线程中有一个线程t,由于线程之间的冲突导致t线程分的时间片低,导致t线程基本不运行,这种情况下t线程就处于饥饿。...
2022-07-22 14:49:21
292
原创 【面试:并发篇20:多线程:多把锁问题】
我们现在有这么一个问题,有一个房子有卧室和书房,书房可以用来学习卧室可以用来睡觉,但是学习和睡觉两件事不冲突,不过学习和学习直接冲突睡觉和睡觉冲突。这个就是我们的问题,如果仅仅只有房子这一把锁,势必会导致睡觉的时候房子被占用不能用来学习,显然是不合适的。...
2022-07-21 13:40:11
193
原创 【面试:并发篇19:多线程:Park&Unpark】
基本使用//暂停当前线程LockSupport.park();//恢复某个线程的运行LockSupport.unpark(暂停线程对象)当在某线程使用LockSupport.park();后此线程变为WATING状态。
2022-07-20 14:16:05
236
原创 【面试:并发篇18:多线程:设计模式】保护性暂停的应用与扩展
这个图中t0t2t4是寄信人线程,t1t3t5负责邮递员线程负责送信与代写信。每个信都有自己的id与内容id可以理解为收信人的地址,寄信人通过邮递员把新送给收信人,这里我们只研究寄信人与邮递员之间的消息传递。注意一个邮递员只能寄一封信。...
2022-07-19 12:02:03
220
原创 【面试:并发篇17:多线程:设计模式】保护性暂停
线程通信时的手段,用在一个线程等待另一个线程的执行结果注意点1.有一个结果需要从一个线程传递到另一个线程,让他们关联到同一个GuardedObject2.如果有结果不断从一个线程到另一个线程那么可以使用消息队列,后续也会用此设计模式实现3.join、Future的实现,采用的也是此设计模式,后续也会分析4.因为要等待另一方的结果,因此归类到同步模式图片解释t1需要从GuardedObject中获取response值,t2需要从GuardedObject中给response赋值。......
2022-07-18 14:42:41
212
1
原创 【面试:并发篇16:多线程:wait/notify详解】原理及错误用法(虚假唤醒等)
我们之前学习的过程中浅显的了解过wiat/notify,但是没有系统的介绍过wait/notify,wait是使线程陷入等待notify是随机唤醒一个被wait的线程。obj.wait()wait方法让进入object监视器的线程到waitSet等待。wait后会释放对象锁,让其他线程竞争wait的有时限方法,如果在时限内没有其他线程唤醒,则自己直接唤醒自己,若期间有别的线程唤醒那就正常唤醒。wait后会释放对象锁,让其他线程竞争notify方法让正在waitSet等待的线程挑一个唤醒结果解释。...
2022-07-17 16:34:41
912
原创 【面试:并发篇15:多线程:synchronized优化原理】
synchronized优化主要是在四个方面重量级锁,轻量级锁,自旋锁,偏向锁,接下来的内容都会讲解这些锁。MarkWord结构加锁状态Statehashcode25age001Normalthread2age101Biased3000301011。
2022-07-16 15:22:07
135
原创 【面试:并发篇14:多线程: Monitor 概念】
Monitor被翻译为监视器或管程,每一个java对象都可以关联一个Monitor对象,如果使用synchronized给对象上锁(重量级锁)之后,改对象头的MarkWord中被设置指向Monitor对象的指针。
2022-07-15 14:01:14
204
原创 【面试:并发篇13:多线程: 变量的线程安全分析】
如果有任何问题请指出,感谢。成员变量和静态变量是否线程安全?局部变量是否线程安全?结果解释成员变量与静态变量都是被多个线程共享,一旦发送读写操作 就会出现线程安全问题,这里很明显method1调用了method2与method3 题目分别为添加一个字符串和删除一个字符串 是读写操作 所以出现了线程安全的问题,即还没有添加就先删除了。图片解释例子结果解释我们这里把list有成员变量改为了局部变量 可以发现现在的结果为空 说明没有问题,原因是:局部变量每次创建都会复制出一个副本也就是线程1的list与线程2
2022-07-14 12:20:22
344
原创 【探究为什么String类是不可变类型:String类仿写】
如果有任何问题请指出,感谢。我们都知道String类是不可变类型,但很少人思考为什么它是不可变类型,然后我抱着这个想法去搜索了一下搜索结果这个是String源代码可以看出确实如上面描述的那样,可是我依然不理解为什么这样就是不可变类型,可能是我比较愚笨,所以采用了最朴素的方法来证明它是不可变的,那就是仿写一个,看看加不加final的区别这里我们拿A类模拟String类,val数组模拟value数组,change()方法模拟 String直接赋值,tostring方法模拟toString方法结果解释在我们cl
2022-07-13 09:55:23
202
原创 【面试:并发篇12:多线程:线程八锁】
如果有任何问题请指出,感谢。线程八锁 其实就是考察 synchronized 锁住的是哪个对象结果这个很好理解 两个锁的监听器都是 Number的对象n1,不过结果为什么有21 因为虽然可能性很小 但依然有可能先运行b线程结果解释如果a b线程的监听器都是 n1对象,所以如果a线程执行 那么就会是先等1s 再12,如果是b线程先执行 就会是2等1s再1结果解释因为c线程没有加锁,ab线程加锁且监听器都是n1,又因为 线程a等待1s,所以 要么b线程先执行要么c先执行,所以答案就是上述结果结果解释因为
2022-07-12 14:03:20
228
原创 【基础知识】c指针、c++引用、java引用对比
如果有任何问题请指出,感谢。对于java引用来说 它没有c/c++那样可以直接操作底层内存地址的能力,但并不代表它不重要,事实上java中有时需要理解某个概念的情况下 不懂java引用 会理解的很不清楚。这个例子很简单就是交换两个字符,我们分别用java引用,c++引用实现,最终我们用c语言分别把他们的等效写法 写一下 最终实现对比c指针 c++引用 java引用的目的。结果很符合直觉结果可以看出交换失败注意:这里我们使用的是StringBuilder而不使用String的原因是,StringBuild
2022-07-11 16:08:52
466
原创 【面试:并发篇11:多线程:任务分配】喝茶例子
如果有任何问题请指出,感谢。我们现在有一个任务是 喝茶,喝茶的前提是 必须完成:洗水壶(1min) 烧开水(15min) 洗茶壶(1min) 洗茶杯(2min) 拿茶叶(1min)这时我们怎么分配任务才能使时间最短?通过观察我们可以发现,洗水壶是烧开水的前提 除此之外其他的任务之间没有关系,故我们可以这样做 洗水壶 烧开水 烧开水其间可以进行 洗茶壶 洗茶杯 拿茶叶三个任务,故总耗时为16min画图解释这里用秒表示分钟结果解释我们可以把程序(进程)理解为工厂,把cpu理解为指挥,把线程理解为员工,所以
2022-07-10 14:18:41
312
原创 【面试:并发篇10:多线程:线程六种状态详解】
如果有任何问题请指出,感谢。我们之前已经介绍过了线程的六种状态,但是介绍的比较浅显,这里我们更加深刻的理解一下线程的六种状态及其代码示例。这里最应该注意的是RUNNABLE状态 其实是包括了 可运行 运行 阻塞 三个状态,其中阻塞状态是操作系统IO层面的 与 BLOCKED不一样RUNNABLE 中 阻塞状态 代码结果我们在第7行打上断点 查看此时t1的状态可以看出当我们主线程在睡眠50ms期间 t1线程正在读取文件 但还没有读完 此时t1现在属于IO阻塞 但是我们在debug界面可以看到 t1线程现在是
2022-07-09 16:10:25
430
原创 【面试:并发篇09:多线程:interrupt 方法详解】
如果有任何问题请指出,感谢。程序中,有些线程的中断需要外部干预,比如线程中存在while(true)循环,或者存在一些阻塞操作,比如 sleep、wait、join等。中断线程的方式,如果直接使用stop、suspend等方法,对程序来说是不太严谨的,这些方法类似于直接杀死线程,可能会造成数据问题。interrupt方法的使用可以解决该问题,调用指定线程的该方法,表示向指定线程发起通知,可以执行中断线程的操作了,而具体什么时候执行,由线程自己决定,这种方式可以让程序处理更加严谨。打断 sleep,wai
2022-07-07 11:58:34
773
原创 【面试:并发篇08:多线程: join 方法详解】
如果有任何问题请指出,感谢。join的目的是为了把调用join的线程“插队”到了当前线程,并且 调用join的线程一定会把此线程运行结束。同步:需要等待结果返回,才能继续运行就是同步异步:不需要等待结果返回,就能继续运行就是异步结果解释因为此时为异步,且t1线程在给r赋值前 sleep了1秒,导致主线程先运行了log.debug(“结果为:{}”, r)这个语句 此时这个r还没有被赋值故结果为0结果解释因为此时是同步,t1.join()后,把t1线程加入到了主线程,并且把t1执行完成后才会继续执行主线程
2022-07-05 00:45:43
808
原创 【面试:并发篇07:多线程:一些方法的注意点】
有任何问题请指出,感谢。我们知道 start方法是运行Thread里的run方法,那么我们之间调用run方法,这两者之前的区别是什么结果可以看出 直接调用 run 是在主线程中执行了 run,没有启动新的线程 使用 start 是启动新的线程,通过新的线程间接执行 run 中的代码sleepyield结果刚开始调用的时候t1状态为运行态,之后当t1线程调用sleep时 主线程查看t1的状态为TIMED_WAITING(阻塞)结果可以看出t2线程yield让步后就变为了RUNNABLE就绪态yield并
2022-07-01 23:14:58
288
5
原创 【面试:并发篇05:基础原理】
如果有任何问题请指出,感谢各位。我们都知道 JVM 中由堆、栈、方法区所组成,其中栈内存是给谁用的呢?其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。简而言之一个线程有一个栈,一个方法有一个栈帧结果文字解释debug解释可以看出程序的运行过程结果因为多线程是的运行是由cpu控制的,所以结果是随机的,上面的结果只是一种情况文字解释debug解释可以看出两个线程是在独立运行的,且切换到另一个线程时会保存原线程状态。因为以下一些原因导致 cpu 不再执行当前的线程,转而执行另一个线程的代码当 上下
2022-06-26 13:48:26
67
原创 【面试:并发篇04:多线程:锁】生产者消费者
如果有任何问题请指出,感谢。这里的例子是生产者消费者模型waitsleepnotifynotifyAll结果结果
2022-06-23 21:10:05
249
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人