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

郑州网站制作生产厂商定制更换wordpress字体

郑州网站制作生产厂商定制,更换wordpress字体,口碑营销案例分析,电商网站有那些写在前面:无论是调用哪种等待和唤醒的方法,都必须是当前线程所持有的对象,否则会导致 java.lang.IllegalMonitorStateException 等并发安全问题。 以三个线程循环打印 XYZ 为例。 一、方法 1.1 Object 对象锁 可以通过 synchronized 对方…

写在前面:无论是调用哪种等待和唤醒的方法,都必须是当前线程所持有的对象,否则会导致 java.lang.IllegalMonitorStateException 等并发安全问题。

以三个线程循环打印 XYZ 为例。

一、方法

1.1 Object 对象锁

可以通过 synchronized 对方法、对象实例、类加锁,并调用加锁对象的 Object#wait() (会释放线程持有的锁)和 Object#notify() 方法等待和唤醒线程。

class Main {// 打印次数private static final int times = 10;// 下一个打印的字母类型private static volatile int type = 0;public static void main(String[] args) {for (int i = 0; i < 3; i++) {int v = i;new Thread(() -> print(v)).start();}}/*** curType:当前线程打印的类型* 对静态方法加锁,锁住的是类本身*/private static synchronized void print(int curType) {for (int i = 0; i < times; ) {try {// 如果当前类型不是自己的类型,则等待while (type != curType) {Main.class.wait();}char c = (char) ('X' + curType);System.out.print(c);type = (type + 1) % 3;i++;// 唤醒全部线程Main.class.notifyAll();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}
}

1.2 Lock#Condition 类

Condition 类与 Lock 类配合使用,允许多个 Condition 和一个 Lock 关联,提供了更加灵活强大的线程同步机制。

class Main {// 打印次数private static final int times = 10;// 下一个打印的字母类型private static volatile int type = 0;private static Lock lock = new ReentrantLock();private static Condition[] conditions = new Condition[3];static {for (int i = 0; i < 3; i++) {conditions[i] = lock.newCondition();}}public static void main(String[] args) {for (int i = 0; i < 3; i++) {int v = i;new Thread(() -> print(v)).start();}}/*** curType:当前线程打印的类型*/private static void print(int curType) {for (int i = 0; i < times; ) {lock.lock();try {// 如果当前类型不是自己的类型,则等待while (type != curType) {conditions[curType].await();}char c = (char) ('X' + curType);System.out.print(c);type = (type + 1) % 3;i++;// 唤醒下一个线程conditions[type].signal();} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {lock.unlock();}}}
}

1.3 Semaphore

1.4 CyclicBarrier

1.5 CountDownLatch

二、注意事项

2.1 虚假唤醒

class Main {// 打印次数private static final int times = 10;// 下一个打印的字母类型private static volatile int type = 0;public static void main(String[] args) {Main1 main = new Main1();for (int i = 0; i < 3; i++) {int v = i;new Thread(() -> main.print(v)).start();}}private synchronized void print(int curType) {for (int i = 0; i < times; ) {try {// 如果当前类型不是自己的类型,则等待if (type != curType) {wait();}char c = (char) ('X' + curType);System.out.print(c);type = (type + 1) % 3;i++;// 唤醒全部线程notifyAll();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}
}

大家可以执行一下这段代码,会发现打印出来的结果是乱序的,问题的原因就是发生了虚假唤醒。

所谓虚假唤醒,指的是线程在没有满足唤醒条件的情况下被唤醒,发生的原因(排除自身代码逻辑问题)主要是内核线程调度器的调度策略不当(出于性能和效率的考量,会提前唤醒某些线程)。

而只需要把这里改成 while 循环,在线程被唤醒后再检查一遍是否满足唤醒条件即可。

while (type != curType) {wait();
}

2.2 IllegalMonitorStateException 异常原因

调用等待和唤醒方法的线程没有持有对应的锁。

// 正确
Object lock = new Object();
synchronized(lock){lock.wait();
}// 错误,this.wait() 关联的是当前对象实例的锁,而不是 lock 实例
// 当前线程并未对当前对象实例加锁,抛出 IllegalMonitorStateException 异常
Object lock = new Object();
synchronized(lock){this.wait();
}

http://www.dtcms.com/a/518711.html

相关文章:

  • 网站建设中的问题wordpress移动端适配
  • 手机平台网站系统怎么做推广网站赌场
  • 长春火车站现在正常通车吗苏州做网站公司精选苏州聚尚网络
  • 网络营销网站建设课程建网站步骤
  • 注册公司在哪个网站系统厦门网站建设方案优化
  • 免费个人网站建设大全企业网站ui设计欣赏
  • 杭州自助建站网站专门做酒的网站有哪些
  • 天津企业网站模板建站哪家好wordpress 协会主题
  • 专业微网站建设公司自己做网站可以上传软件下载
  • 合肥做兼职网站网站建设岗位能力评估表
  • 百姓网站制作注册建设网站的公司哪家好
  • 乐达网站建设公司全网络品牌推广
  • 如何百度收录我的网站最好的做网站
  • 有没有做淘宝网站的企业网站备案网址
  • 厦门网站建设的公司哪家好网站建设需要哪些流程
  • 网站建设 申请杭州百度公司在哪里
  • 网站流量监控怎么做wordpress语法高亮插件
  • windows2008 iis 网站配置越秀区手机版网站建设
  • 搭建网站视频教程郑州网站建设、
  • 成都网站建设 Vr功能 卓 公司WordPress多站点默认设置
  • 怎样做网站的用户分析郑州网站建设出名吗
  • 沈阳公司建设网站wordpress搜索排序
  • 做像素画的网站地推app
  • 做设计外包的网站温州设计公司排名
  • 网站建设专员一定要会网站建设吗营销型网站建设优化建站
  • 网站运营方案 网站建设设计制作植物标识牌
  • 参与做网站的收获软件推广赚佣金渠道
  • 查网站服务器速度网站建设都有什么技术支持
  • 西安医疗网站建设wordpress主题自定义模块
  • 徐州好点的做网站的公司怎样修改静态公司网站页面电话