`
BBjava
  • 浏览: 125436 次
  • 性别: 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关键字来修饰购票的方法,这样...

    NET多线程同步方法详解

    .NET中的多线程同步是确保在并发环境下多个线程安全访问共享资源的关键技术。本文将深入探讨.NET框架中实现线程同步的多种方法。 首先,我们来看自由锁(InterLocked)。自由锁主要通过Interlocked类提供的静态方法来...

    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()`方法随机唤醒正在等待该对象锁的线程之一。被唤醒的线程将有机会重新获取锁并继续...

    多线程同步演示(采用CreateThread()和WaitForMultipleObjects()函数)

    总结来说,这个多线程同步演示利用`CreateThread()`创建了多个并发运行的线程,模拟了5人赛跑的过程,然后通过`WaitForMultipleObjects()`进行线程同步,确保所有赛跑完成后再进行结果处理。这样的例子展示了如何在...

    java多线程同步问题

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

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

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

    C#读写线程同步Demo

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

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

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

Global site tag (gtag.js) - Google Analytics