
juc
文章平均质量分 57
ADRU
这个作者很懒,什么都没留下…
展开
-
ReentrantLock的公平锁机制如何实现的?(源码理解)
接下来,方法获取头节点的下一个节点(s = h.next),并检查该节点是否为null或者该节点的线程不是当前线程(s.thread!是指多个线程按照申请锁的顺序来获取锁,即线程会直接进入队列中排队,队列中的第一个线程才能获得锁。这种机制确保了线程获取锁的公平性,避免了“饥饿”现象,即等待时间过长的线程无法获取到锁的情况。默认情况下,ReentrantLock是非公平的,这是因为非公平锁的效率通常要高于公平锁。在没有特殊需求的情况下,一般推荐使用非公平锁,因为它能提供更高的性能。,则表示成功获取锁。原创 2024-02-04 16:36:42 · 710 阅读 · 0 评论 -
利用ReentrantLock解决死锁----以哲学家问题为例
每位哲学家需要两根筷子才能吃饭,而每根筷子只能被一位哲学家使用,这就导致了资源的互斥性。在吃饭时会拿起左右两边的筷子,并保持持有直到吃完饭。如果筷子不足,他们就会等待,在这个场景中,哲学家不会从其他哲学家手中抢夺筷子,只有当筷子可用时,他们才会拿起筷子。可能发生所有哲学家都拿着手中的一根筷子,同时等待另一根筷子的情况,这样就形成了一个环路,每个人都在等待其他人释放资源,导致所有人都无法继续进餐,即发生了死锁。运行结果: 发现代码不会继续执行 ,此时已经发生了死锁。1. 采用synchronized写法。原创 2024-02-04 15:52:53 · 494 阅读 · 0 评论 -
ReentrantLock相较于synchronized的区别---锁超时(源码理解)
ReentrantLock支持设置锁等待超时时间,即在一定时间内未获得锁的线程可以选择放弃等待,避免死锁arg表示获取锁时的参数,表示最大等待时间(以纳秒为单位)。这个方法具体逻辑如下:首先,线程会尝试获取锁。如果锁当前未被其他线程持有,则线程直接获取锁并返回true。如果锁被其他线程持有,线程将进入等待队列,并启动一个计时器,设置超时时间。在等待过程中,线程可能会被其他线程中断,或者等待时间达到设定的超时时间。如果发生这些情况,线程将停止等待,并返回false。原创 2024-02-04 15:24:03 · 533 阅读 · 0 评论 -
ReentrantLock相较于synchronized有哪些区别(一)?
可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁。如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住。调用lockInterruptibly()方法执行打断。相对于 synchronized 它具备如下特点。与 synchronized 一样,都支持。运行结果:可以发现全部加锁成功了。原创 2024-02-04 14:38:46 · 355 阅读 · 0 评论 -
自定义一个线程安全的生产者-消费者模型(大厂java面试题)
生产者-消费者模型的核心思想是通过阻塞队列和线程的等待和通知机制实现生产者和消费者之间的协作,确保生产者不会向满队列中添加消息,消费者不会从空队列中获取消息,从而有效地解决了多线程间的同步问题。方法1向队列中放入消息,如果队列中的数据满了就线程等待,方法2从队列中拿数据,如果队列空了就等待。如果你的需求比较简单,只是需要创建和管理一些基本的线程,第一种方式可能更简单和直观。:这个方法用于将消息放入队列。如果队列已满,生产者需要等待,直到队列有足够的空间。方法释放锁,并处于等待状态,直到队列中有足够的空间。原创 2024-02-01 14:30:06 · 455 阅读 · 0 评论 -
线程在操作系统以及java中的几种状态(源码分析)
例如,调用Object.wait()方法会使线程进入等待状态,直到其他线程调用Object.notify()或Object.notifyAll()方法唤醒它。(Blocked):当一个线程在执行过程中遇到某种情况,如等待输入、等待I/O操作完成等,它可能会暂时停止执行,进入阻塞状态。例如,调用Thread.sleep(long millis)方法会使线程进入限时等待状态,直到指定的时间过去或者被其他线程中断。当一个线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞,直到该锁被释放。原创 2024-01-26 16:05:04 · 482 阅读 · 1 评论 -
如何利用线程打断机制优雅的实现日志监控?
然后,在main()方法中,我们启动了这个线程,并在1秒后调用了thread.interrupt()方法来中断它。当线程被中断时,它会抛出InterruptedException异常,从而使得线程从阻塞状态中恢复执行。:Thread.interrupt()方法可以实现线程的打断。当一个线程处于阻塞状态(如等待、睡眠等)时,可以通过调用该线程的interrupt()方法来中断它。当线程被中断时,它会抛出一个InterruptedException异常,从而使得线程从阻塞状态中恢复执行。原创 2024-01-26 11:50:42 · 422 阅读 · 0 评论