热门标签 | 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();}}
}

 


推荐阅读
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • Beetl是一款先进的Java模板引擎,以其丰富的功能、直观的语法、卓越的性能和易于维护的特点著称。它不仅适用于高响应需求的大型网站,也适合功能复杂的CMS管理系统,提供了一种全新的模板开发体验。 ... [详细]
  • 深入理解Java SE 8新特性:Lambda表达式与函数式编程
    本文作为‘Java SE 8新特性概览’系列的一部分,将详细探讨Lambda表达式。通过多种示例,我们将展示Lambda表达式的不同应用场景,并解释编译器如何处理这些表达式。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • Asynchronous JavaScript and XML (AJAX) 的流行很大程度上得益于 Google 在其产品如 Google Suggest 和 Google Maps 中的应用。本文将深入探讨 AJAX 在 .NET 环境下的工作原理及其实现方法。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • Hibernate全自动全映射ORM框架,旨在消除sql,是一个持久层的ORM框架1)、基础概念DAO(DataAccessorOb ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文探讨了如何通过优化 DOM 操作来提升 JavaScript 的性能,包括使用 `createElement` 函数、动画元素、理解重绘事件及处理鼠标滚动事件等关键主题。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • Logging all MySQL queries into the Slow Log
    MySQLoptionallylogsslowqueriesintotheSlowQueryLog–orjustSlowLog,asfriendscallit.However,Thereareseveralreasonstologallqueries.Thislistisnotexhaustive:Belowyoucanfindthevariablestochange,astheyshouldbewritteninth ... [详细]
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社区 版权所有