多线程
文章平均质量分 56
Mr-X~
持续学习,不断进步!
展开
-
深入理解CAS
文章目录深入理解CASCAS的定义CAS的例子使用CAS实现一个线程安全的计数器CAS中的ABA问题深入理解CASCAS的定义CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。这样说或许有些抽象,我们来看一个例子:CAS的例子1.在内存地址V当中,存储着值为10的变量。2.此时原创 2021-05-25 20:11:02 · 802 阅读 · 3 评论 -
想要理解volatile关键字,你只需要掌握它的这三个特点
文章目录想要理解volatile关键字,你只需要掌握它的这三个特点volatile关键字可以保证被修饰变量的可见性volatile不能保证修饰变量的原子性volatile可以避免指令重排想要理解volatile关键字,你只需要掌握它的这三个特点volatile关键字可以保证被修饰变量的可见性要想理解volatile关键字,得先了解下JAVA的内存模型,Java内存模型的抽象示意图如下:从图中可以看出每一个线程,都有一个本地内存,操作共享变量的时候,线程执行时,会先把主内存中的共享变量拷贝一份到每一原创 2021-05-24 21:00:27 · 298 阅读 · 1 评论 -
多线程中的经典例题---卖票
文章目录多线程中的经典例题---卖票使用Runnable接口创建线程使用Thread线程类的子类创建对象多线程中的经典例题—卖票使用Runnable接口创建线程使用Runnable接口创建线程的时候,可以直接创建一个接口,然后实现内部的run方法,最后让接口对象作为Thread线程类的构造器的一个参数;也可以写一个Runnable接口的实现类,然后实现Runnable接口内部的run方法,然后让这个实现类作为Thread线程类的构造器的一个参数,其实也即是间接的让Runnable接口作为Thread线原创 2021-05-24 15:37:18 · 800 阅读 · 0 评论 -
两个线程频繁进行上下文切换引发的线程安全问题分析以及使用synchronized关键字的解决方案
文章目录两个线程频繁进行上下文切换引发的线程安全问题分析以及使用synchronized关键字的解决方案线程安全问题的例子线程安全问题的解决synchronized关键字不加在方法上synchronized关键字加到方法上两个线程频繁进行上下文切换引发的线程安全问题分析以及使用synchronized关键字的解决方案线程安全问题的例子两个线程频繁进行上下文切换,如果这个过程中,这两个线程共用了同一个资源,这里是counter静态变量,那么就可能会出现线程安全问题,如下图:以上的结果可能是正数,负数原创 2021-05-24 09:52:23 · 734 阅读 · 2 评论 -
临界区与竞态条件
临界区与竞态条件一个程序运行多个线程本身是没有问题的问题出在多个线程访问共享资源多个线程读共享资源其实也没有问题在多个线程对共享资源读写操作时发生指令交错,就会出现问题一段代码内存在共享资源,并且多个线程可以对这部分共享资源进行读写操作,那么这段代码的区域就叫做临界区,如下:static int counter=0;static void increment()//临界区{ counter++;}//临界区static void decrement(){ counter-原创 2021-05-24 09:49:13 · 212 阅读 · 0 评论 -
守护线程
守护线程默认情况下,Java进程需要等待所有线程都运行结束,才会结束,有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,守护线程也会强制结束,如下图:垃圾回收器就是一种守护线程,当程序停止了,垃圾回收器也会强制停止。...原创 2021-05-23 11:36:18 · 95 阅读 · 0 评论 -
线程优先级
线程优先级线程优先级会提示调度器优先调度该线程,但它仅仅是一个提示,调度器可以忽略它,具体的实现依赖于操作系统的任务调度器如果cpu比较忙,那么优先级高的线程会获得更多的时间片,但cpu闲时,优先级几乎没作用...原创 2021-05-23 11:34:48 · 86 阅读 · 0 评论 -
多线程中一些常见方法和一些不推荐使用的方法
文章目录多线程中一些常见方法和一些不推荐使用的方法多线程中一些常见方法不推荐使用的方法多线程中一些常见方法和一些不推荐使用的方法多线程中一些常见方法start():启动一个新线程,在新的线程运行run方法中的代码,start方法只是让线程进入就绪状态,里面的代码不一定立刻运行(CPU的时间片还没分给它),每个线程对象的start方法只能调用一次,如果调用了多次会出现IllegalThreadStateExceptionrun():新线程启动后会调用的方法,如果在构造Thread对象时传递了Runna原创 2021-05-23 11:33:45 · 316 阅读 · 0 评论 -
线程上下文切换(Thread Context Switch)
线程上下文切换(Thread Context Switch)因为以下一些原因导致cpu不再执行当前的线程,转而执行另一个线程的代码。发生的原因,有如下几个:1.线程的cpu时间片用完2.垃圾回收3.有更高优先级的线程需要运行,4.线程自己调用了sleep,yield,wait,join,park,sychronized,lock等方法当Context Switch发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java中对应的概念就是程序计数器(Program Counter原创 2021-05-23 11:20:10 · 771 阅读 · 0 评论 -
异步调用和创建线程
异步调用和创建线程异步调用从方法调用的角度来讲,如果:需要等待结果返回,才能继续运行就是同步不需要等待结果返回,就能继续运行就是异步注意:同步在多线程中还有另外一层意思,就是让多个线程步调一致设计:多线程可以让方法执行变为异步的(即不要巴巴干等着)比如说读取磁盘文件时,假设读取操作花费了5秒钟,如果没有线程调度机制,这5秒调用者什么都做不了,其代码都得暂停结论:比如在项目中,视频文件需要转换格式等操作比较费时,这时开一个新线程处理视频转换,避免阻塞主线程tomcat的异步servlet也原创 2021-05-21 17:15:03 · 658 阅读 · 0 评论 -
进程与线程概念和并行与并发概念
文章目录进程与线程概念和并行与并发概念进程与线程概念并行与并发概念进程与线程概念和并行与并发概念进程与线程概念进程:进程其实就相当于运行程序的一个实例,比如说运行记事本,这时就相当于是运行一个进程。有的程序可以运行多个进程实例,比如说记事本,你可以打开多个记事本;而有的程序只能运行一个进程实例,比如说网易云,你只能打开一个网易云音乐。线程:线程存在于进程里面,一个进程可以有多个线程,每个线程其实内部都是由多条指令组成的,是一个指令流,指令流中的一条条指令以一定的顺序交给CPU执行。并行与并发概念原创 2021-05-19 17:55:26 · 209 阅读 · 6 评论