- 博客(18)
- 收藏
- 关注
原创 Docker基础命令
docker rm 容器id # 删除容器(不能删除正在运行的容器)如果要强制删除:docker rm -f 容器id。[root@//]# docker rmi -f $(docker images -aq) # 删除全部的镜像。[root@//]# docker rmi -f 镜像id 镜像id 镜像id # 删除多个镜像(空格分隔)-q, --quiet # 仅显示镜像id (docker images -q)-a, --all # 显示所有镜像 (docker images -a)
2024-06-21 13:15:37
705
原创 Docker-快速入门
确保你的虚拟机已经安装Docker,且网络开通的情况下,执行下面命令即可安装MySQL:💡mysql当我们利用Docker安装应用时,Docker会自动搜索并下载应用镜像(image)。镜像不仅包含应用本身,还包含应用运行所需要的环境、配置、系统函数库。Docker会在运行镜像时创建一个隔离环境,称为容器(container)。镜像仓库:存储和管理镜像的平台,Docker官方维护了一个公共仓库:Docker Hub。Docker是做什么的?什么是镜像?什么是容器?什么是镜像仓库?
2024-06-20 21:14:37
253
原创 使用ThreadLocal
对于多任务,Java标准库提供的线程池可以方便地执行这些任务,同时复用线程。这种在一个线程中,横跨若干方法调用,需要传递的对象,我们通常称之为上下文(Context),它是一种状态,可以是用户身份、任务信息等。给每个方法增加一个context参数非常麻烦,而且有些时候,如果调用链有无法修改源码的第三方库,方法,它内部需要调用若干其他方法,同时,我们遇到一个问题:如何在一个线程内传递状态?没有被清除,该线程执行其他代码时,会把上一次的状态带进去。注意到普通的方法调用一定是同一个线程执行的,所以,
2024-06-20 15:40:48
265
原创 使用Atomic
Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。它的主要原理是利用了CAS:Compare and Set。包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于。在高度竞争的情况下,还可以使用Java 8提供的。这样的封装好的方法,因此,使用起来非常简单。CAS是指,在这个操作中,如果。通常情况下,我们并不需要直接用。的值,最终的结果也是正确的。实现复杂的并发操作,而是用。循环,即使其他线程修改了。,就什么也不干,返回。
2024-06-20 11:18:44
529
原创 使用Concurrent集合
因为所有的同步和加锁的逻辑都在集合内部实现,对外部调用者来说,只需要正常按接口引用,其他代码和原来的非线程安全代码完全一样。方法时,该方法内部可能会让线程变成等待状态,直到队列条件满足不为空,线程被唤醒后,非常有用,所以我们不必自己编写,可以直接使用Java标准库的。使用这些并发集合与使用非线程安全的集合类完全相同。但是它实际上是用一个包装类包装了非线程安全的。包也提供了对应的并发集合类。加锁,这样获得的线程安全集合的性能比。的意思就是说,当一个线程调用这个。集合要低很多,所以不推荐使用。
2024-06-20 11:14:38
260
原创 乐观锁StampedLock
显然乐观锁的并发效率更高,但一旦有小概率的写入导致读取的数据不一致,需要能检测出来,再读一遍就行。还提供了更复杂的将悲观读锁升级为写锁的功能,它主要使用在if-then-update的场景:即先读,如果读的数据满足条件,就返回,如果读的数据不满足条件,再尝试写。这样一来,我们读的数据就可能不一致,所以,需要一点额外的代码来判断读的过程中是否有写入,这种读锁是一种乐观锁。,会发现它有个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种悲观的读锁。
2024-06-19 22:47:08
507
原创 线程同步和解决死锁
当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。这个时候,有个单线程模型下不存在的问题就来了:如果多个线程同时读写共享变量,会出现数据不一致的问题。上面的代码很简单,两个线程同时对一个int变量进行操作,一个加10000次,一个减10000次,最后结果应该是0,但是,每次运行,结果实际上都是不一样的。这是因为对变量进行读取和写入时,结果要正确,必须保证是原子操作。原子操作是指不能被中断的一个或一系列操作。
2024-06-19 13:15:40
663
原创 线程的状态,中断及守护线程
在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了。run()sleep()run()用一个状态转移图表示如下:当线程启动后,它可以在RunnableBlockedWaiting和这几个状态之间切换,直到最后变成Terminated状态,线程终止。run()returnrun()Threadstop()一个线程还可以等待另一个线程直到其运行结束。例如,main线程在启动t线程后,可以通过t.join()等待t。
2024-06-18 20:25:32
826
原创 java多线程
在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。操作系统调度的最小任务单位其实不是进程,而是线程。
2024-06-18 18:37:56
628
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人