推广 热搜: 广场  Java  Word  app  营业  微信公众号  北京代理记账  商城  代理记账  商标交易 

java线程原理分析 Java并发线程如何阻塞和唤醒?

   2023-04-27 企业服务招财猫20
核心提示:Java并发线程如何阻塞和唤醒?每个对象都有两个方法wait和notify,以及同步。Java并发线程的阻塞和唤醒可以分为几类:1.同步是基于JVM的对象头实现的。当多个线程竞争同一个关键资源时,它们

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()方法:挂起和唤醒线程,suspende()使线程进入阻塞状态,只有调用对应的resumee()时,线程才会进入可执行状态。不建议这样做,容易出现死锁。

3.yield()方法:调用yield()的效果相当于调度器认为线程已经执行了足够的时间,可以切换到另一个线程。

让下面我们就来谈谈这三种。可以去csdn看看,了解一下其他的。

java的线程安全是什么?谁能一言以蔽之?

这真的可以不要用一句话来概括。我写了一篇关于线程安全的长文,我提炼了下面这段话,基本够理解了:

单线程不会有安全问题,多线程编程会有安全问题。根本问题在于是否存在关键资源竞争资源。如果多线程不会访问竞争资源,就不会有安全问题,否则会处理。

什么是竞争资源,如下所示:

如果它们访问它们上下文的资源,比如kafka消费分区工作线程访问它们各自的存储,它们将不会互相干扰;

如果在一个要执行的方法中只使用局部变量,它们不会互相干扰,因为它们位于各自的线程堆栈中;

如果执行的方法使用传入的变量,即所谓的形参变量,取决于传入的变量是否是对象。如果它只是一个普通的参数,它不没关系。如果是对象,要看对象是不是同一个引用,不同的引用没有关系。

如果在一个执行的方法中使用了相同的引用,不管它是传入的还是外部的全局变量,比如log4的伐木工,唐不要担心,因为log4已经完成了线程安全的编写。

如果在执行的方法中使用了相同的引用:

I)但只是读而不写,读与读之间没有,也不没关系。

Ii)有所有的写,但是写不依赖于读,也就是说,线程可以直接写到覆盖,而不需要获得"最新"数据,这种情况无关紧要;

Iii)两者都是写的,写的时候要看最新的资料,所以需要处理;

 
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
合作伙伴
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  冀ICP备2023006999号-8