多线程
文章平均质量分 59
lwd2621
这个作者很懒,什么都没留下…
展开
-
01-4 哪些指令不能重排:Happen-Before规则
虽然Java虚拟机和执行系统会对指令进行一定的重排序,但是指令重排是有原则的,并非所有的指令都可以随便改变执行位置,一下罗列了一些基本原则,这些原则是指令重排不可违背的。程序顺序原则:一个线程内保证语义的串行性。 volatile规则:volatile变量的写先于读发生,这保证了volllatile变量的可见性。 锁规则:解锁(unlock)必然发生在随后的加锁(lock前)。 传递性:A先于B,B先于C,那么A必然先于C。 线程的start()方法先于它的每一个动作。 线程的所有操...原创 2021-01-17 16:12:19 · 119 阅读 · 0 评论 -
01-3 JMM-多线程
由于并发程序要比串行程序复杂很多,其中一个重要原因是并发程序中数据访问的一致性和安全性将会受到严重挑战。如何保证一个线程可以看到正确的数据呢?这个问题看起来很白痴。对于串行程序来说,根本就是小菜一碟,如果你读取一个变量,这个变量的值是1,那么你读到的一定是1,就是这么简单的问题在并行程序中居然变得复杂起来。事实上,如果不加控制的任由线程胡乱并行,即使原本是1的数据,你也有可能读到2。因此,我们需要在深入了解并行机制的前提下,在定义一种规则,保证多个多线程间可以有效地、正确地协同工作。而JMM...原创 2021-01-17 16:06:27 · 88 阅读 · 0 评论 -
01-2 并发级别(阻塞、无饥饿、无障碍、无锁、无等待)
由于临界区的存在,多线程之间的并发必须受到控制。根据控制并发的策略,我们可以把并发的级别分为阻塞、无饥饿、无障碍、无锁、无等待几种。1、阻塞 一个线程是阻塞的,那么在其他线程释放资源之前,当前线程无法继续执行,当我们使用synchronized关键字或者重入锁时,我们得到的就是阻塞的线程。 synchronized关键字和重入锁都试图在执行后续代码前,得到临界区的锁,如果得不到,线程就会被挂起等待,直到占有了所需资源为止。2、无饥饿(Starvation...原创 2021-01-13 21:58:45 · 264 阅读 · 0 评论 -
01-1 死锁(Deadlock)、饥饿(Starvation)、活锁(LiveLock)
死锁、饥饿和活锁都属于多线程的活跃性问题。如果发生了上述几种情况,那么表示相关线程可能就不活跃了,也就是说它可能很难再继续往下执行了。1、死锁 死锁应该是最糟糕的一种情况了,比如两个人再吃饭,吃饭需要筷子和碗,假设现在都只有一个,A率先拿到了筷子,而B率先拿到了碗,此时A和B都再互相等待着对方手中的资源,没有的到资源之前,都一直处于等待的状态,此时就会造成两个人永远再互相等待,这是一件非常可怕的事情。 死锁是一个很严重的并且应该避免和时时小心的问题。...原创 2021-01-13 20:54:20 · 700 阅读 · 0 评论