热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ExceptioninthreadThread0java.lang.IllegalMonitorStateException

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException线程“thread -0”java.lang.IllegalM

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException

线程“thread -0”java.lang.IllegalMonitorStateException中的异常

 


/*** * Title:生产者* Description:* @author lcs* @date 2018年12月12日* @version 1.0*/
public class Productor implements Runnable{private static String[] goodsType={"iPhone7", "iPhone8", "iPhoneX", "博世冰箱", "格力空调", "吉利房车", "电动汽车", "思科路由器", "华为交换机", "大疆无人机"};private static final int STORE_MAX = 1000;//单例,getProductorprivate static Productor productor=null;public static Productor getProductor(){if(productor == null)productor =new Productor();//创建的时候就使用无参构造方法return productor;}//编写无参构造方法private Productor(){//要给出具体的实现方法,总是增删改,所以用linkedList方法store = new LinkedList();}//库存private List store;//再搞把锁对象private Object lock;public void setLock(Object lock){this.lock=lock;}//此方法为从库存中获取一个商品的最基本操作//此方法只会在消费者线程中调用,因此我们可以在消费者处进行同步//库存store也是private的,消费这个操作不好直接对库存进行操作 //是给Consumer配置的方法,增加是add往最后加,那么消费的时候就remove(0),从头拿//有一个就拿一个,疑问若有类型A的东西,但没有类型b的东西,但是拿b怎么办?public Goods getOneGoods(){Goods g =null;if (store.size()==0) return null;g=store.remove(0);//打印库存剩余产品数量System.out.println("消费一个商品,库存目前剩余:" + store.size());return g;}//一次生产N个产品,N设定为5-10//一批产品,为能够生产的10种中的同一种产品private void produceGoods(){//随机出本次商品的数量int n= (int) (Math.random()*101+50);//随机出商品的种类int type= (int) (Math.random()*10);String gType=goodsType[type];int i;synchronized (lock) {for ( i = 0; i //意思是不可能让一直生产,cpu主频很快,得休息一下啊Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

出现这个问题是没有把判断条件放入到synchronized方法块里面

生产者和消费者两个都是多线程,不管别人怎么样,自己生产,同时也消费

synchronized(this) //锁住当前对象的引用,则任何线程通过当前线程访问到此句,会锁住,直到放开锁,其他线程才能进来。

重写run方法:run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程终止,而CPU再运行其它线程

想想哪里可能有线程冲突:1,生产的时候add,另一个线程消费了remove了,底层不知道,尼玛你到底想干嘛,我操2,一个线程看到还有一个产品,两个线程同时去消费这个产品,产生空指针异常

所以呢,方法前面加synchronized,但是Productor是一个单例对象,这个对象拿来同步,但是Consumer怎么同步呢?

所以,把对生产者库存的这个数据要保护起来,把跟集合有关系的包进来

package com.chinasofti.ProductorConsumer;public class Goods {//当前一共产出了多少个货物public static int count = 0;//生产了产品,name就是public static Goods createOneGoods(String name){count++;return new Goods(count,name);}private Goods(int id, String name) {this.id = id;this.name = name;}private int id;//一个货物对象一个id编号private String name;@Overridepublic String toString() {return "Goods [id=" + id + ", name=" + name + "]";}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

 

package com.chinasofti.ProductorConsumer;public class Consumer extends Thread{private static int consumedGoods = 0;private Object lock;public Consumer(String name){super(name);}public void setLock(Object lock) {this.lock = lock;}private void consumeGoods(){//一次消费N个商品,从生产商处拿货int n = (int)(Math.random()*2 + 1);//一次消费10-20个商品synchronized (lock) {for(int i=0;i}

package com.chinasofti.ProductorConsumer;public class TestClass {public static void main(String[] args) {Object lock &#61;new Object();//生产者消费者都用一个锁Thread productor &#61;new Thread(Productor.getProductor());Productor.getProductor().setLock(lock);productor.start();try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}//十个顾客for(int i&#61;0;i<10;i&#43;&#43;){Consumer consumer &#61;new Consumer("顾客"&#43;i&#43;1);consumer.setLock(lock);consumer.start();}}
}

 


推荐阅读
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了Java中org.eclipse.ui.forms.widgets.ExpandableComposite类的addExpansionListener()方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。这些示例来源于多个知名开源项目,具有很高的参考价值。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
author-avatar
一叶之秋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有