java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常

标题已经说明,子线程wai()时候默认的锁不是同步代码块的锁,因此wai时候显示的指明锁,现在解释看code:

public class Test {
//	static	boolean flag=true;
	public static void main(String[] args) throws InterruptedException {

		Zp z=new Zp();
		Thread st=new Thread(z);
		st.start();
		for(int x=0;x<100000;x++)
		{
			if(x%5000==0)
			{
//				flag=false;
				Thread.sleep(3000);
				synchronized (Test.class) //这里必须判断同步,否则当子线程没有放弃锁的时候,就执行下面会出现异常
				{
					Test.class.notify();
				}

			}
		}

	}
static class Zp implements Runnable
{
	@Override
	public void run() {

		synchronized (Test.class) {
			while(true)
			{
			for(int x=0;x<10;x++)
			{
			System.out.println("haha...");
			}

					try {
						Test.class.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
			}
		}
	}

}

}

  

时间: 2024-11-06 10:18:25

java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常的相关文章

Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)

今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这一特性很是熟悉! 结果发现,我错了! 答案是: 值传递!Java中只有按值传递,没有按引用传递! 回家后我就迫不及待地查询了这个问题,觉得自己对java这么基础的问题都搞错实在太丢人! 综合网上的描述,我大概了解了是怎么回事,现在整理如下,如有不对之处望大神提出! 先来看一个作为程序员都熟悉的值传递

Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码

1 import java.util.Collections; 2 import java.util.LinkedList; 3 import java.util.List; 4 5 public class Test { 6 7 List list = new LinkedList(); 8 public static void main(String[] args) { 9 List list = new LinkedList(); 10 for ( int i = 0 ; i < 9 ;

关于java中static的应用及一种常见错误

JAVA中的static的应用 在web项目的开发中,遇到了类中的static方法不奏效. 在开发过程中,我定义了一个静态方法初始化数组,但是在创建类的对象后,访问该数组是全为null.我一直以为static应该是在程序启动的时候已经加载并执行的,所以对这样的结果百思不得其解,最后我找到关于java中的static的方法应用的资料,研读后,发现静态方法和静态代码块是有区别的:静态代码块是自动执行的,静态方法是在被调用的时候才执行的. 总结static用法如下: (1)在java中可以定义一个不需

快速理解Java中的五种单例模式

解法一:只适合单线程环境(不好) package test; /** * @author xiaoping * */ public class Singleton { private static Singleton instance=null; private Singleton(){ } public static Singleton getInstance(){ if(instance==null){ instance=new Singleton(); } return instance;

快速理解Java中的六种单例模式

饿汉式(推荐) package concurencyv2.chapter1; public class SingletonV2 { private static final SingletonV2 instance = new SingletonV2(); private SingletonV2() {} public static SingletonV2 getInstance() { return instance; } } 优点:初试化静态的instance创建一次.如果我们在Single

Java中线程同步的理解 - 其实应该叫做Java线程排队

Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可能和其他线程共享一些资源,比如,内存,文件,数据库等. 当多个线程同时读写同一份共享资源的时候,可能会引起冲突.这时候,我们需要引入线程"同步"机制,即各位线程之间要有个先来后到,不能一窝蜂挤上去抢作一团. 同步这个词是从英文synchronize(使同时发生)翻译过来的.我也不明白为什么

在 Java 的多线程中,如何去判断给定的一个类是否是线程安全的(另外:synchronized 同步是否就一定能保证该类是线程安全的。)

同步代码块和同步方法的区别:同步代码块可以传入任意对象,同步方法中 如果多个线程检查的都是一个新的对象,不同的同步锁对不同的线程不具有排他性,不能实现线程同步的效果,这时候线程同步就失效了. 两者的区别主要体现在同步锁上面.对于实例的同步方法,因为只能使用this来作为同步锁,如果一个类中需要使用到多个锁,为了避免锁的冲突,必然需要使用不同的对象,这时候同步方法不能满足需求,只能使用同步代码块(同步代码块可以传入任意对象): 有几个原则的:程序次序规则:一个线程内,代码的执行会按照程序书写的顺序

Java中的比较

Java SE.Java EE.Java ME区别 是什么: Java SE=Java Standard Edition=J2SE= Java标准版 Java EE=Java Enterprise Edition=J2EE= Java企业版 Java ME=Java Mobile Edition=J2ME = Java移动版 特点: SE主要用于桌面程序(Swing),控制台开发(main程序). EE企业级开发(JSP,Struts,Spring,Hibernate,EJB,iBATIS等),

java中volatitle关键字的作用

用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致 的情况.volatile就是用来避免这种情况的.volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) =========================分割线1================================= 版权声明 :转载时请以超链接形式标明文章原始出处和作者信息及