当前位置: 首页 > wzjs >正文

房产cms名优网站关键词优化

房产cms,名优网站关键词优化,网站首页模板代码,重庆做网站开发的公司文章目录 1. 线程间通信1.1 基本原理1.2 使用场景 2. 死锁与防范2.1 死锁产生的原因2.2 避免策略 3. 实践:生产者—消费者模型示例3.1 完整示例代码3.2 代码详解 4. 总结与思考 1. 线程间通信 1.1 基本原理 wait() 方法 当线程调用对象上的 wait() 方法时&#xff…

文章目录

  • 1. 线程间通信
    • 1.1 基本原理
    • 1.2 使用场景
  • 2. 死锁与防范
    • 2.1 死锁产生的原因
    • 2.2 避免策略
  • 3. 实践:生产者—消费者模型示例
    • 3.1 完整示例代码
    • 3.2 代码详解
  • 4. 总结与思考

1. 线程间通信

1.1 基本原理

  • wait() 方法
    当线程调用对象上的 wait() 方法时,当前线程会释放该对象的锁,并进入等待状态,直到其他线程调用同一对象上的 notify() 或 notifyAll() 方法。
    注意:必须在 synchronized 块中调用 wait()。

  • notify() 方法
    当线程调用 notify() 方法时,会随机唤醒等待该对象锁的一个线程,使其重新进入可运行状态。
    注意:同样需要在 synchronized 块中调用。

  • notifyAll() 方法
    与 notify() 类似,但会唤醒所有等待该对象锁的线程。
    一般在生产—消费者模型中,唤醒所有等待的线程以便竞争资源。

1.2 使用场景

  • 线程间协调 :例如在生产者—消费者模型中,生产者生产数据后通知消费者;消费者数据不足时,等待生产者通知。

  • 保证顺序与互斥 :通过 wait/notify 机制实现线程按照预定顺序操作共享数据,确保数据一致性。

2. 死锁与防范

2.1 死锁产生的原因

  • 死锁(Deadlock) :多个线程相互等待对方释放资源,导致所有线程都无法继续执行。

  • 死锁的四个必要条件:
    1.互斥条件 :资源不能共享。
    2.请求与保持条件 :线程已获得资源,但仍在等待其它资源,同时保持已获得资源。
    3.不剥夺条件 :资源不能被强制收回,只能在任务完成后由线程主动释放。
    4.循环等待条件 :存在一组线程,形成循环等待资源的关系。

2.2 避免策略

  • 破坏循环等待条件 :设定资源获取顺序,所有线程按照固定次序获取资源。
  • 加锁超时 :使用可中断的锁申请,当等待时间超时后放弃当前申请,避免死锁。
  • 减少锁的粒度 :尽量减少临界区代码,使用细粒度锁降低冲突几率。
  • 使用死锁检测工具 :监控程序运行时的线程状态,以便及时发现和解决死锁。

3. 实践:生产者—消费者模型示例

下面的示例中,我们实现一个简单的生产者—消费者模型,使用共享缓冲区作为资源,生产者和消费者通过 wait/notify 协调工作。
代码中包含三个部分:

  • Buffer 类 :共享缓冲区,内部使用队列存储数据,提供 synchronized 方法进行生产和消费操作。
  • Producer 类 :生产者线程,不断向缓冲区添加数据,当缓冲区满时等待。
  • Consumer 类 :消费者线程,不断从缓冲区取出数据,当缓冲区为空时等待。

3.1 完整示例代码

// ProducerConsumerDemo.javaimport java.util.LinkedList;
import java.util.Queue;public class ProducerConsumerDemo {public static void main(String[] args) {// 创建共享缓冲区,容量为 5Buffer buffer = new Buffer(5);// 创建生产者和消费者线程Thread producerThread = new Thread(new Producer(buffer), "Producer");Thread consumerThread = new Thread(new Consumer(buffer), "Consumer");// 启动线程producerThread.start();consumerThread.start();}
}// 共享缓冲区类,使用 wait/notify 协调生产者与消费者
class Buffer {private Queue<Integer> queue = new LinkedList<>();private int capacity;public Buffer(int capacity) {this.capacity = capacity;}// 生产数据:当缓冲区满时等待,否则添加数据,并调用 notifyAll 通知消费者public synchronized void produce(int value) throws InterruptedException {while (queue.size() == capacity) {System.out.println(Thread.currentThread().getName() + " 等待,缓冲区已满!");wait();  // 释放锁并等待}queue.add(value);System.out.println(Thread.currentThread().getName() + " produced: " + value);notifyAll();  // 通知等待的线程}// 消费数据:当缓冲区为空时等待,否则取出数据,并调用 notifyAll 通知生产者public synchronized int consume() throws InterruptedException {while (queue.isEmpty()) {System.out.println(Thread.currentThread().getName() + " 等待,缓冲区为空!");wait();}int value = queue.poll();System.out.println(Thread.currentThread().getName() + " consumed: " + value);notifyAll();return value;}
}// 生产者线程类
class Producer implements Runnable {private Buffer buffer;public Producer(Buffer buffer) {this.buffer = buffer;}@Overridepublic void run() {int value = 0;while (true) {try {buffer.produce(value++);Thread.sleep(500);  // 模拟生产过程} catch (InterruptedException e) {e.printStackTrace();}}}
}// 消费者线程类
class Consumer implements Runnable {private Buffer buffer;public Consumer(Buffer buffer) {this.buffer = buffer;}@Overridepublic void run() {while (true) {try {buffer.consume();Thread.sleep(1000); // 模拟消费过程} catch (InterruptedException e) {e.printStackTrace();}}}
}

运行结果:
运行 ProducerConsumerDemo 后,控制台输出可能类似如下(注意线程调度具有随机性,具体输出顺序可能交替变化):

Producer produced: 0
Consumer consumed: 0
Producer produced: 1
Producer produced: 2
Producer produced: 3
Producer produced: 4
Producer produced: 5
Producer 等待,缓冲区已满!
Consumer consumed: 1
Producer produced: 6
Consumer consumed: 2
Consumer consumed: 3
...

说明:

  • 生产者:

    • 会先产生数据(例如 0、1、2…)并打印 “Producer produced: X”。
    • 当缓冲区中的数据达到容量(容量设置为 5)时,生产者会打印 “Producer 等待,缓冲区已满!” 并调用 wait() 进入等待状态,直到消费者取走数据释放空间。
  • 消费者:

    • 当缓冲区非空时消费数据,打印 “Consumer consumed: X”,当缓冲区为空时会打印 “Consumer 等待,缓冲区为空!” 并调用 wait()。
    • 由于消费者休眠时间较长(1000ms),通常会使得生产者较快地填满缓冲区,从而观察到生产者“等待”的输出。
  • 协调工作:

    • 每当生产者成功生产数据后调用 notifyAll(),唤醒等待中的消费者;同理,消费者消费数据后调用 notifyAll() 来唤醒等待生产者。
    • 随着线程不断重复调用生产和消费操作,整个系统保持一个平衡状态,确保数据不会丢失或重复。

3.2 代码详解

  • Buffer 类:

    • 使用 synchronized 修饰方法,保证同一时刻只有一个线程能够操作队列。
    • 生产者调用 produce 方法时,若缓冲区已满(队列大小达到容量),调用wait()进入等待状态,并打印相应信息;成功生产后调用 notifyAll() 通知其它等待线程。
    • 消费者调用consume方法时,若缓冲区为空,调用wait()进入等待状态;成功消费后调用 notifyAll() 进行通知。
  • Producer 与 Consumer 类:

    • 生产者线程不断生产数据,并调用缓冲区的 produce 方法。
    • 消费者线程不断消费数据,并调用缓冲区的 consume 方法。
    • 模拟生产与消费过程中的延时,通过 Thread.sleep() 模拟执行耗时,便于观察线程间的协调效果。
  • ProducerConsumerDemo 主类:

    • main方法中,创建共享的 Buffer 实例,并启动一个生产者和一个消费者线程。运行过程中,通过等待和通知,生产者与消费者在共享缓冲区间交替执行,避免了数据丢失和竞争问题。

4. 总结与思考

  • 线程间通信:

    • 通过·wait()notify()notifyAll()实现线程间的协调,确保在临界区内的线程能够互相告知状态变化,从而达到数据共享和顺序控制。
  • 死锁防范:

    • 学习了死锁的四个必要条件,并通过设计合理的同步代码(避免不必要的嵌套锁定和严格的锁获取顺序)来防止死锁的发生。
    • 编写协作代码时,应尽量缩小 synchronized 块的范围,确保及时释放锁。
http://www.dtcms.com/wzjs/231877.html

相关文章:

  • 电商网站如何做精细化运营重庆seo教程博客
  • 网站建设维修服务流程网站如何赚钱
  • wordpress 企业模板 免费下载合肥seo网络优化公司
  • seo包年推广杭州seo教程
  • 音乐网站样式设计seo百度首页排名业务
  • 成都网站建设金网科技一个完整的营销策划案范文
  • 企业网站建设jz190大地seo视频
  • 张家港网站制作快速排名怎么做
  • 电子商务学网站建设好吗品牌服务推广
  • 杭州市网站制作seo模拟点击有用吗
  • 秦皇岛做网站网络营销推广计划
  • 清河做网站重庆关键词优化平台
  • 浙江省建设厅继续教育官方网站看广告赚钱的平台
  • 天津专业网站建设公司重庆seo网站哪家好
  • 网站域名过期了怎么办上海专业网络推广公司
  • 中建三局招聘出国务工武汉百度网站优化公司
  • 东营建设信息网站网络搜索引擎有哪些
  • 购物网站怎么做seo推广薪资
  • 网站整体规划什么广告推广最有效果
  • 建网站 陕西牛人网络科技网络推广专家
  • 培训班线上优化深圳seo优化排名推广
  • 北京网站建设平台谷歌seo优化怎么做
  • axure网站返回顶部按钮怎么做软文代写费用
  • 网站建设中可能升级网站加速器
  • 辽宁网站建设熊掌号aso优化技术
  • 湖南株洲静默广州网站制作实力乐云seo
  • 网站建设中什么意思整站关键词快速排名
  • 手机设计培训网站建设seo关键词排名价格
  • 橙子建站短信验证码安全吗短视频平台推广方案
  • 自我介绍html网页模板seo培训