java线程原理分析 Java并发线程如何阻塞和唤醒?
Java并发线程如何阻塞和唤醒?
每个对象都有两个方法wait和notify,以及同步。
Java并发线程的阻塞和唤醒可以分为几类:
1.同步是基于JVM的对象头实现的。当多个线程竞争同一个关键资源时,它们会根据不同的锁机制(旋转锁、轻/重锁)进行阻塞和唤醒。
2.这里暂时跳过了notify/wait、yeild等基本机制,一般的实现原理是基于对象的同步队列非常类似于后面的AQS。
3.并发组件的基本AQS侧重于AQS(AbstractQueuedSynchronizer)。
因为这是jdk外包的基础(比如Lock、BlockingQueue、CountdownLatch等。).
Aqs基本上是通过一个易变的变量状态和一个等待队列来实现的。在抢锁时,CAS先修改状态,失败后放入等待队列,通过LockSupport挂起线程。
当锁的拥有者释放锁时,它会通过LockSupport唤醒等待队列的后续节点,让它再次尝试抢锁(CAS修改状态),以此类推。
掌握AQS的原理对理解jdk中的很多并发组件很有帮助。
()方法:以毫秒为单位,使线程处于阻塞状态,时间到了自动唤醒。
()和resume()方法:挂起和唤醒线程,suspend e()使线程进入阻塞状态,只有调用对应的resume e()时,线程才会进入可执行状态。不建议这样做,容易出现死锁。
3.yield()方法:调用yield()的效果相当于调度器认为线程已经执行了足够的时间,可以切换到另一个线程。
让 下面我们就来谈谈这三种。可以去csdn看看,了解一下其他的。
java的线程安全是什么?谁能一言以蔽之?
这真的可以 不要用一句话来概括。我写了一篇关于线程安全的长文,我提炼了下面这段话,基本够理解了:
单线程不会有安全问题,多线程编程会有安全问题。根本问题在于是否存在关键资源竞争资源。如果多线程不会访问竞争资源,就不会有安全问题,否则会处理。
什么是竞争资源,如下所示:
如果它们访问它们上下文的资源,比如kafka消费分区工作线程访问它们各自的存储,它们将不会互相干扰;
如果在一个要执行的方法中只使用局部变量,它们不会互相干扰,因为它们位于各自的线程堆栈中;
如果执行的方法使用传入的变量,即所谓的形参变量,取决于传入的变量是否是对象。如果它只是一个普通的参数,它不 没关系。如果是对象,要看对象是不是同一个引用,不同的引用没有关系。
如果在一个执行的方法中使用了相同的引用,不管它是传入的还是外部的全局变量,比如log4 的伐木工,唐 不要担心,因为log4已经完成了线程安全的编写。
如果在执行的方法中使用了相同的引用:
I)但只是读而不写,读与读之间没有,也不 没关系。
Ii)有所有的写,但是写不依赖于读,也就是说,线程可以直接写到覆盖,而不需要获得 "最新 "数据,这种情况无关紧要;
Iii)两者都是写的,写的时候要看最新的资料,所以需要处理;
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。