并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析

public class ThreadTest implements Callable<String> {

	 public  String call() throws Exception {
		// TODO Auto-generated method stub
		wait(10000);
		return "hello";
	}

}

调用代码:

public static void main(String[] args) {
		System.out.println("开始启动线程"+Thread.currentThread().getName());
		ExecutorService exe = Executors.newCachedThreadPool();
		ThreadTest t= new ThreadTest();
		Future<String> f = exe.submit(t);
		Future<String> f2 = exe.submit(t);
		try {

				t.notify();

			System.out.println(f.get());
			System.out.println(f2.get());
			System.out.println("主线程"+Thread.currentThread().getName());
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

在学习并发是遇到了如下错误

java.lang.IllegalMonitorStateException: current thread not owner

我的代码如下:

通过查找资料找到原因即解决之道。

《java编程思想》第四版一书中有描述到:“线程操作的wait()、notify()、notifyAll()方法只能在同步控制方法或同步控制块内调用。如果在非同步控制方法或控制块里调用,程序能通过编译,但运行的时候,将得到 IllegalMonitorStateException
异常,并伴随着一些含糊信息,比如 ‘当前线程不是拥有者’。其实异常的含义是 调用wait()、notify()、notifyAll()的任务在调用这些方法前必须 ‘拥有’(获取)对象的锁。”

JAVA JDK API文档中也有描述如下:

wait()、notify()、notifyAll()法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:

  • 通过执行此对象的同步 (Sychronized) 实例方法。
  • 通过执行在此对象上进行同步的 synchronized 语句的正文。
  • 对于 Class 类型的对象,可以通过执行该类的同步静态方法。

根据以上分析,我的代码修改如下:

1、call方法前增加synchronized关键字,这样调用wait()方法就不会出错了。

2、在t.notify()方法调用时使用同步上下文,改为如下:

synchronized (t) {

t.notify();

}

再次运行就正常了。

并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析,布布扣,bubuko.com

时间: 2024-08-26 21:33:53

并发 错误 java.lang.IllegalMonitorStateException: current thread not owner 分析的相关文章

线程中的current thread not owner异常错误

多线程常用的一些方法: wait(),wait(long),notify(),notifyAll()等 这些方法是当前类的实例方法, wait()      是使持有对象锁的线程释放锁;wait(long)是使持有对象锁的线程释放锁时间为long(毫秒)后,再次获得锁,wait()和wait(0)等价;notify()    是唤醒一个正在等待该对象锁的线程,如果等待的线程不止一个,那么被唤醒的线程由jvm确定;notifyAll 是唤醒所有正在等待该对象锁的线程. 并且应该优先使用notify

多线程之同步synchronized的使用不当造成java.lang.IllegalMonitorStateException 异常

package com.bjsxt.d822.a2; public class SubThread9 extends Thread { /* * 当多个对象同时对同一个资源操作,则必须使用同步机制来控制. * * 1.当方法去操作共享资源时,则该方法必须通过 synchronized关键字来修饰. * 2.当方法被 synchronized 关键字修饰时,还需要 wait() 和 notify()两个方法配合使用. * wait()方法是让当前线程对象进入等待状态. * notify()方法是让

异常分析:java.lang.IllegalMonitorStateException

java.lang.IllegalMonitorStateException JavaDoc上关于IllegalMonitorStateException的解释是: Thrown to indicate that a thread has attempted to wait on an object's monitor or to notify other threads waiting on an object's monitor without owning the specified mo

(四)关于java.lang.IllegalMonitorStateException异常说明

1.异常原因及解释 首先你要了解这个异常为什么会抛出,这个异常会在三种情况下抛出:1>当前线程不含有当前对象的锁资源的时候,调用obj.wait()方法;2>当前线程不含有当前对象的锁资源的时候,调用obj.notify()方法.3>当前线程不含有当前对象的锁资源的时候,调用obj.notifyAll()方法. java.lang.IllegalMonitorStateException是在调用object的wait和notify,notifyAll方法的时候可能会出现的异常. 在调用上

遇到的错误java.lang.ClassCastException

package tpackage; public class ArrayList<E> { private Object list[]; private int sum=0; public ArrayList(){ this(16); } public ArrayList(int capacity) { list = new Object[capacity]; } public E[] toArray() //将Object数组转型为 E[] { return (E[]) list; } pu

错误: java.lang.reflect.InvocationTargetException

错误: java.lang.reflect.InvocationTargetException    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 

mybatis-plus 错误 java.lang.NoClassDefFoundError

错误 java.lang.NoClassDefFoundError: org/apache/velocity/context/Context 使用mybatis-plus自动生成文件的时候,报下面的错误: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/velocity/context/Context at com.baomidou.mybatisplus.generator.AutoGener

Android中运行的错误:java.lang.UnsatisfiedLinkError: Couldn&#39;t load locSDK3: findLibrary returned null.

今天在使用百度地图的时候运行发现报错: 明明已经加入了liblocSDK3.so,但总是无法定位.提示错误java.lang.UnsatisfiedLinkError: Couldn't load locSDK3: findLibrary returned null. 网上找了很多的资料找到一个方法: 在libs下新建一个armeabi-v7a,然后将liblocSDK3.so复制一份到该文件夹" 如果这个不行,那么新建一个armeabi文件夹再放入liblocSDK3.so就可以了. Andr

Android - 错误: java.lang.IllegalStateException: Already attached

错误: java.lang.IllegalStateException: Already attached 本文地址: http://blog.csdn.net/caroline_wendy 可能原因: @Override protected void onContinueCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } onContinueCreate和重写onCreate方法不一致; 修改为: