![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 67
luo♛
这个作者很懒,什么都没留下…
展开
-
乐观锁StampedLock
显然乐观锁的并发效率更高,但一旦有小概率的写入导致读取的数据不一致,需要能检测出来,再读一遍就行。还提供了更复杂的将悲观读锁升级为写锁的功能,它主要使用在if-then-update的场景:即先读,如果读的数据满足条件,就返回,如果读的数据不满足条件,再尝试写。这样一来,我们读的数据就可能不一致,所以,需要一点额外的代码来判断读的过程中是否有写入,这种读锁是一种乐观锁。,会发现它有个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种悲观的读锁。原创 2024-06-19 22:47:08 · 507 阅读 · 0 评论 -
使用ReadWriteLock
读写锁的使用原创 2024-06-19 22:42:05 · 212 阅读 · 0 评论 -
使用Concurrent集合
因为所有的同步和加锁的逻辑都在集合内部实现,对外部调用者来说,只需要正常按接口引用,其他代码和原来的非线程安全代码完全一样。方法时,该方法内部可能会让线程变成等待状态,直到队列条件满足不为空,线程被唤醒后,非常有用,所以我们不必自己编写,可以直接使用Java标准库的。使用这些并发集合与使用非线程安全的集合类完全相同。但是它实际上是用一个包装类包装了非线程安全的。包也提供了对应的并发集合类。加锁,这样获得的线程安全集合的性能比。的意思就是说,当一个线程调用这个。集合要低很多,所以不推荐使用。原创 2024-06-20 11:14:38 · 260 阅读 · 0 评论 -
使用Atomic
Atomic类是通过无锁(lock-free)的方式实现的线程安全(thread-safe)访问。它的主要原理是利用了CAS:Compare and Set。包除了提供底层锁、并发集合外,还提供了一组原子操作的封装类,它们位于。在高度竞争的情况下,还可以使用Java 8提供的。这样的封装好的方法,因此,使用起来非常简单。CAS是指,在这个操作中,如果。通常情况下,我们并不需要直接用。的值,最终的结果也是正确的。实现复杂的并发操作,而是用。循环,即使其他线程修改了。,就什么也不干,返回。原创 2024-06-20 11:18:44 · 529 阅读 · 0 评论 -
线程同步和解决死锁
当多个线程同时运行时,线程的调度由操作系统决定,程序本身无法决定。因此,任何一个线程都有可能在任何指令处被操作系统暂停,然后在某个时间段后继续执行。这个时候,有个单线程模型下不存在的问题就来了:如果多个线程同时读写共享变量,会出现数据不一致的问题。上面的代码很简单,两个线程同时对一个int变量进行操作,一个加10000次,一个减10000次,最后结果应该是0,但是,每次运行,结果实际上都是不一样的。这是因为对变量进行读取和写入时,结果要正确,必须保证是原子操作。原子操作是指不能被中断的一个或一系列操作。原创 2024-06-19 13:15:40 · 663 阅读 · 0 评论 -
线程的状态,中断及守护线程
在Java程序中,一个线程对象只能调用一次start()方法启动新线程,并在新线程中执行run()方法。一旦run()方法执行完毕,线程就结束了。run()sleep()run()用一个状态转移图表示如下:当线程启动后,它可以在RunnableBlockedWaiting和这几个状态之间切换,直到最后变成Terminated状态,线程终止。run()returnrun()Threadstop()一个线程还可以等待另一个线程直到其运行结束。例如,main线程在启动t线程后,可以通过t.join()等待t。原创 2024-06-18 20:25:32 · 825 阅读 · 0 评论 -
java多线程
在计算机中,我们把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程,类似的,音乐播放器和Word都是进程。某些进程内部还需要同时执行多个子任务。例如,我们在使用Word时,Word可以让我们一边打字,一边进行拼写检查,同时还可以在后台进行打印,我们把子任务称为线程。进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程。操作系统调度的最小任务单位其实不是进程,而是线程。原创 2024-06-18 18:37:56 · 628 阅读 · 0 评论