`
BBjava
  • 浏览: 124244 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

线程同步之wait()

阅读更多
下面内容包括内部类实例化,wait()调用,静态块,块,try-catch块语句
会逐一讲一下。



package org.iteye.bbjava.concurreycy;

public class TestWait {

	static {
		
	}
	
	public TestWait(){
		
	}
	
	class Apple{
		
	}
	
	public void testWaitMethod(Apple a){
		try {
			a.wait();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static void main(String []args){
		
		TestWait t = new TestWait();
		t.testWaitMethod(t.new Apple());
	}
}





上面的程序编译能通过,但运行时会抛出:
引用
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at org.iteye.bbjava.concurreycy.TestWait.testWaitMethod(TestWait.java:19)
at org.iteye.bbjava.concurreycy.TestWait.main(TestWait.java:29



根椐tij4的concurrency部份的内容,调用wait(),notify(),notifyAll()必须使用synchronized块来获得lock,如:
synchronized (a){
				a.wait();
			}


如你所见,在上面完整代码中的29行是内部类Apple实例化的写法。
完整写法下面改进代码中会出现。



下面将改进代码:
package org.iteye.bbjava.concurreycy;

public class TestWait {
	
	
	{ System.out.println(" 3 ");}
	static {
		System.out.println(" 2");
	}
	
	public TestWait(){
		System.out.println("  1  ");
	}
	
	class Apple{
		
	}
	
	public void testWaitMethod(Apple a){
		try {
			synchronized (a){
				a.wait();
			}
			System.out.println("testWaitMethod have been called");
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public  void testNotifyMethod(Apple a){
		synchronized (a){
			a.notify();
		}
		System.out.println("testWaitMethod have been called");
	}
	
	public static void main(String []args){
		
		TestWait t = new TestWait();
		Apple a = t.new Apple();
		t.testWaitMethod(a);
		t.testNotifyMethod(a);
		
	}
}




改进后的代码运行结果:
引用
2
3
  1 


我期待TestWait的构造方法是第一运行,但事实情况是最后,它们加载顺序是静态块,块,构造方法。
分享到:
评论

相关推荐

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    总之,Java多线程同步通过wait()、notify()和notifyAll()等方法,配合synchronized关键字,实现了对共享资源的访问控制,保证了程序的正确性。同时,原子操作和volatile关键字提供了更细粒度的线程安全保证。理解并...

    多线程同步和通讯完整示例

    synchronized关键字提供了基本的线程同步,而wait-notify机制和Lock接口则提供了更高级的线程通讯和控制手段。在实际开发中,根据具体需求选择合适的同步策略,可以提高程序的效率和正确性。通过学习和实践...

    Jni多线程同步事例

    在本例“Jni多线程同步事例”中,我们将探讨如何在JNI层面上实现多线程同步,特别是在一个生产者-消费者模型的场景下。 生产者-消费者模型是一种经典的并发问题,它涉及到两个或多个线程之间的协作。在该模型中,...

    线程同步面试题深入解析

    线程同步是多线程编程中的关键概念,用于解决并发执行时可能出现的数据竞争问题,确保对共享资源的正确访问和管理。在Java中,线程同步主要通过`synchronized`关键字来实现,防止多个线程同时访问临界区,以避免出现...

    简单实现多线程同步示例(模拟购票系统)

    为了实现线程同步,Java提供了多种机制,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)等。在这个示例中,我们可能会用到synchronized关键字来修饰购票的方法,这样...

    java 多线程同步方法的实例

    Java提供了多种机制来实现线程同步,主要包括synchronized关键字、wait()、notify()和notifyAll()方法以及ReentrantLock等。 1. **synchronized关键字**:这是Java中最基本的线程同步方式。它可以用于修饰方法或...

    操作系统实验 多线程同步与互斥 java编写 有界面

    操作系统实验是计算机科学教育中的重要组成部分,它...总之,理解和掌握多线程同步与互斥的概念是成为一名合格的Java开发者的关键技能之一。通过实际的编程实验,可以加深对这些概念的理解,并锻炼解决并发问题的能力。

    使用CEvent对象实现线程同步

    在多线程编程中,线程同步是一种关键的技术,它确保了多个线程在访问共享资源时能够有序、安全地进行。MFC(Microsoft Foundation Classes)库为C++程序员提供了丰富的线程同步机制,其中CEvent类是常用的一种。本文...

    线程同步问题

    通过本文的介绍,我们了解到Java中的线程同步主要依靠监视器机制实现,而`synchronized`关键字和`wait()`、`notify()`等方法则是实现线程同步的重要工具。掌握这些基础知识对于编写高效、可靠的并发程序至关重要。

    android 线程同步

    ### Android线程同步详解 在Android开发过程中,线程同步是一项非常重要的技术,它能够确保多线程环境下的数据安全性和程序稳定性。本文将详细解析Android中的线程同步机制,包括Mutex、Condition以及Barrier等核心...

    Lab3 线程同步 实验报告1

    我们将创建一个 Condition Variable 对象,并使用 wait 和 signal 操作来实现线程同步。 8. 线程同步的应用 线程同步有广泛的应用,包括: * 并发编程:线程同步是并发编程的基础,它可以保证多个线程之间的协作...

    Java 同步锁 wait notify 学习心得

    使用`wait()`的一个关键前提是在`synchronized`代码块中调用,以确保在释放锁的同时保持线程同步。 #### `notify()` `notify()`方法随机唤醒正在等待该对象锁的线程之一。被唤醒的线程将有机会重新获取锁并继续...

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    重大软院操作系统实验三:线程同步

    操作系统实验三:线程同步是计算机科学中一个关键的主题,特别是在多处理器和多核心系统中,线程同步对于保证程序的正确性和效率至关重要。在这个实验中,我们将深入探讨线程同步的基本概念、方法以及在Linux操作...

    C#读写线程同步Demo

    在C#编程中,线程同步是一个至关重要的概念,特别是在多线程环境下,它确保了对共享资源的正确访问和管理,防止数据竞争和不一致性。本教程将通过一个简单的读写线程同步Demo,帮助你理解如何在C#中实现这一机制。 ...

    操作系统实验 线程同步机制

    操作系统实验 线程同步机制 Nachos 操作系统实验报告中,主要实现了锁机制和条件变量,并利用这些同步机制实现几个基础工具类。下面是该实验报告的详细知识点: 一、锁机制 锁机制是操作系统中最基本的同步机制...

    linux上实现多进程和多线程实现同步互斥(源代码)

    在Linux操作系统中,多进程和多线程是两种并发执行的方式,它们在处理并发问题时,经常需要进行同步和互斥操作,以确保数据的一致性和程序的正确性。本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥...

Global site tag (gtag.js) - Google Analytics