多线程
文章平均质量分 70
介绍多线程之前要介绍线程,介绍线程则离不开进程,以及一些并发的处理
小涂学编程
这个作者很懒,什么都没留下…
展开
-
十七、LockSupport
上面这段代码的意思是,我们定义一个线程,但是在内部进行了park,因此需要unpark才能唤醒继续执行,不过上面,我们在MyThread进行的park,在main线程进行的unpark。现在我们知道了LockSupport是用来阻塞和唤醒线程的,而且之前相信我们都知道wait/notify也是用来阻塞和唤醒线程的,那么它相比,LockSupport有什么优点呢?这个就需要仔细的观察了。LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。原创 2024-03-22 21:50:12 · 271 阅读 · 0 评论 -
十五、ReentrantLock
当线程位于一个线程队列里面,当又有一个新的线程来的时候,他会检查队列里面有没有原来内容,如果不公平,这个线程上来就抢是有可能抢到的,如果是公平锁,这个线程会先检查这个线程里面有没有原来等着的,队列里如果有,它先进队列等着,等别人先去运行,队列里如果没有,我先来。:在非公平锁模式下,线程尝试获取锁时会直接尝试获取,不考虑等待队列中是否有等待的线程。:在公平锁模式下,线程会按照先来先服务的顺序获取锁。当一个线程尝试获取锁时,如果锁已经被其他线程持有,该线程会被放入等待队列中,按照先后顺序等待获取锁。原创 2024-03-18 23:11:14 · 737 阅读 · 0 评论 -
十六、Semaphore
线程结束需要 release();表示其他人可以继续得到了。取得,取一下Semaphore变为1。限流 车道和收费站。原创 2024-03-18 23:11:02 · 200 阅读 · 0 评论 -
十四、ReadWriteLock
同时,2 个写线程需要依次获取写锁执行写操作,每个写线程也需要 1 秒执行完毕。根据代码逻辑,18 个读线程并发执行,每个读线程需要 1 秒执行完毕,因为读操作是并发执行的,所以整体读操作的时间是 1 秒。目前有 18 个线程执行读操作,每个读操作需要 1 秒钟执行,同时有 2 个线程执行写操作,每个写操作也需要 1 秒钟执行。,写线程总共需要 2 秒(1 秒执行写操作,1 秒等待另一个写线程执行完毕),所以整个程序执行的时间大约是 2 秒左右。换成读写锁的时候,读线程是读锁,写线程是写锁,写锁是排他的。原创 2024-03-18 22:29:21 · 285 阅读 · 0 评论 -
十三、Phaser
onAdvance(int phase, int registeredParties) 当前阶段,参与人phaser.arriveAndAwaitAdvance();Phaser 阶段, 不同的阶段。例如:现在一个结婚场景分为4个阶段。每个线程走向对应的阶段就结束。原创 2024-03-18 22:01:06 · 152 阅读 · 0 评论 -
十二、CyclicBarrier
CyclicBarrier 栅栏。什么时候满了开始发车。原创 2024-03-18 21:41:30 · 161 阅读 · 0 评论 -
十一、CountDownLatch
CountDownLatch 倒数的门栓。原创 2024-03-18 21:26:56 · 104 阅读 · 0 评论 -
十、锁的底层实现
自旋锁有个特点,它占CPU但是它不访问操作系统,它是在用户态去解决问题,不经过内核态。因此它在加锁解锁上效率要比内核态高。重量级锁OS不占CPU进入到等待队列的线程,什么CPU开始运行分配时间片。JDK早期的锁都是重量级的锁,都需要找操作系统去申请锁,效率低。什么情况下使用自旋锁比较好?原创 2024-03-18 21:01:44 · 334 阅读 · 0 评论 -
八、CAS (无锁优化)
我们知道Unsafe类是rt.jar包提供的,rt.jar包里面的类是使用Bootstrap类加载器加载的,所以在main函数中加载Unsafe类的时候,根据委托机制,会委托给Bootstrap去加载Unsafe类。现在我期望这个值为3,期望的值为3的时候我在自增改为4,在改的过程当中发现已经变为4的话,和我期望的值对不上了说明有另外一个线程改了这个值,这个时候CAS就在重新再试一遍,在试的时候我期望这个值为4,如果为4,把他改为5。1. 先把0读到自己的线程内存里面来读完之后,改为1。原创 2024-03-18 20:40:55 · 634 阅读 · 0 评论 -
九、Volatile
你把0改为1的写法中判断依然是0,这时候你以为没有被其他线程改动过这个0,其实还有一种情况就是再你把0改为1的过程中另外一个线程已经把0改为3,然后再有第三个线程把这个3改回为0。在多线程递增的变量count 其运算结果就依赖于变量的当前值,使用count ++ 最终都会依赖当前变量的值如果改为 count = 1,这样的情况,那么 count 的值就不依赖变量当前值,因此就不会有线程安全问题。简单地说,内存屏障的作用就是指令重排序时,不能把后面的指令重排序到内存屏障之前的位置。原创 2023-02-23 21:45:43 · 11 阅读 · 0 评论 -
六、守护线程
目录守护线程 定时器生产者和消费者模式java语言中线程分为两大类:一类是:用户线程一类是:守护线程(后台线程)其中具有代表性的就是:垃圾回收线程(守护线程)。 守护线程的特点: 一般守护线程是一个死循环,所有的用户线程只要结束,守护线程自动结束。 注意:主线程main方法是一个用户线程。 守护线程用在什么地方呢? 每天00:00的时候系统数据自动备份。这个需要使用到定时器,并且我们可以将定时器设置为守护线程。一直在那里看着,每到00:00的时候就备份一次,所有的用户线程 如果结束了原创 2022-12-04 21:58:57 · 297 阅读 · 0 评论 -
七、Synchronized锁
扩大线程的同步范围,由原来的在账户类中的线程同步扩大到线程类中调用run中把withdraw方法进行同步方法执行账户取款的范围。实例变量在堆中,静态变量在方法区中,堆和方法区只有一个,堆和方法区都是多线程共享的,所以可能存在线程安全问题。在实例方法上使用synchronized表示共享对象一定是this,并且同步代码块是整个方法体。局部变量永远都不存在安全问题,因为局部变量不共享,只在方法里面生效。 对象锁:1个对象1把锁,100个对象100把锁。 类锁:100个对象,也可能只是1把类锁。原创 2022-12-02 00:08:36 · 97 阅读 · 0 评论 -
五、什么是线程安全?
争对上述的对10000条数据进行插入处理操作,如果我们的服务器端的机器是4核的CPU(4核CPU最多可运行4个线程),现在我们开启4个线程去处理这些数据的插入,这些线程相互独立,并行发起操作,这个就叫做多线程并发。原创 2022-12-01 23:04:17 · 210 阅读 · 0 评论 -
四、线程常用方法使用
让当前线程进入休眠状态,进入休眠状态,放弃占有cpu时间片,让给其他线程使用出现在那个线程中,就让那个线程休眠。向我们在日常开发中异步消费处理的时候,之前的分支线程处理还未结束,但是当前的线程需要分支处理结束的结果,所以需要让当前线程睡眠几秒,等待分支线程处理结束即可。当前线程的优先级设为最高,但是调用join方法,即使main线程优先级最高,但是还是要等待分支线程执行完成,才能执行。这里先让分支线程(t1线程)先睡一年时间,主线程睡5s之后,然后强制中断分支线程的睡眠。了,线程没有保存的数据将会丢失。原创 2022-11-30 23:23:51 · 125 阅读 · 0 评论 -
三、线程的构造方法与三种方式
线程的start方法,是启动线程的方法,当调用该方法就是启用线程,这个线程就从新建状态到达就绪状态。线程的run方法,不会启动线程,不会分配新的分支栈。(这种方式就是单线程)执行上方代码打印对应线程记录,可以看到有主线程与分支线程并发执行。执行上方代码打印对应线程记录,可以看到有主线程与分支线程并发执行。还是走之前的主线程(main线程),执行完直接在上方弹栈。开辟一个分支栈,栈与栈之间相互独立、互不干扰。java.lang.Thread 线程类。一、直接 继承Thread法。二、实现Runnable法。原创 2022-11-30 19:20:45 · 161 阅读 · 0 评论 -
二、线程对象的生命周期
就绪状态又叫可运行状态,表示当前线程具备抢夺CPU的时间片的权利,当一个线程抢夺到了CPU的时间片的时候,就开始执行run方法,run方法的开始执行标志这线程进入运行状态。例如代码中的调用线程的start 方法后,就表示线程就处于就绪状态。,此时线程并未分配cpu资源,操作系统采用抢占方式,谁先获取cpu,谁就可以运行。(刚new出来的线程对象)使用new创建一个线程,此时Java虚拟机就会为其分配内存,并初始化成员变量,此时它只是一个线程对象。当阻塞解除的时候,该线程就会到达就绪状态等待分配CPU。原创 2022-11-30 19:19:42 · 92 阅读 · 0 评论 -
一、线程和进程基础理论
进程是:一个应用程序(1个进程是一个软件)。例如,我现在有个苹果14pro,我打开哔哩哔哩软件,苹果14pro的灵动到就开启了一个进程(哔哩哔哩),当打开王者荣耀的时候就会开启另外一个进程。线程是:一个进程中的执行场景/执行单元。例如,当我们操作王者荣耀释放技能的时候就是一个线程的进行,王者荣耀有许多线程(技能)。所以一个进程可以启动多个线程。对于java程序来说,当在DOS命令窗口中输入:java HelloWorld 回车之后。会先启动JVM,而JVM就是一个进程。原创 2022-11-29 00:01:48 · 100 阅读 · 0 评论