关于java中的synchronized、wait以及notify和notifyAll

本文介绍了Java中多线程的同步方法,包括synchronized关键字的使用方式及其保证的互斥性和可见性特点。此外还详细解释了notify、notifyAll及wait方法的作用与注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.java中多线程同步方法有很多种,可以使用volatile、synchronized同步方法和同步块,以及java内置的一些类和库,如:AtomicInteger类,java.util.concurrent中的类,这些都多提供了同步功能,可以使得在多线程环境中高效而安全的实验我们自己所需要的功能。下面简单介绍synchronized、lock以及notify和notifyAll。

2.首先介绍synchronized,该词的意思是同步的,同步化的。该关键字可用在方法的前面,作为方法的修饰符,可以保证同一时刻只有一个线程执行这个方法,除此之外,还能保证一个类的所有被synchronized修饰的方法中只有一个正在被执行,不会出现在同一时刻不同线程同时在执行这些方法(每个线程执行的是被synchronized修饰的不同的方法)。 另外,还可以用synchronized包围代码块(具体用法请上网查),只要synchronized的同步锁是同一个对象,那么就可以保证这些代码块不会同时被多个线程执行(同一个代码块不会同时被多个线程执行,而且不同代码块也不会被多个线程同时执行)。


3.notify,notifyAll,wait方法必须在该对象的同步代码块内,不然会发生IllegalMonitorStateException异常,实际中需要像下面这样

synchronized (lock) {
    lock.wait()
}

另外需要说明的是,当调用wait方法后,lock所在的代码块会自动释放所拥有的锁lock对象,并且等待某个线程调用notify或者notifyAll方法后再去获得lock锁,然后继续执行。如果wait中有参数,那么当参数所表示的时间后还没有线程调用notify等方法,那么同步代码块会结束等待,然后继续运行。


4.notify和notifyAll的区别

调用notify方法:只通知所有wait的线程中的一个线程结束等待,至于具体是所有等待线程中的哪一个线程有系统决定。而调用notifyAll方法,所有wait的线程都将结束等待,准备执行。


5.得出上述结论所用到的实验代码如下,希望对理解上面的文字有帮助。

public class JavaSynchronization {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final JavaSynchronization instance=new JavaSynchronization();
		try {
			synchronized (instance) {
				instance.wait(100);
				
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				instance.methodA();
			}
		}).start();
		
		
		new Thread(new Runnable() {

			@Override
			public void run() {
				instance.methodB();
			}
		}).start();


	}
	
	private char share=0;
	private Object lock=new Object();
	public void methodA(){
		synchronized (lock) {
			System.out.println("methodA开始了!");
			share='A';
			while(true){
				try {
					lock.wait();
					System.out.println("methodA又继续了!");
					Thread.yield();
				} catch (Exception e) {
					e.printStackTrace();
				}
				if(share!='A'){
					System.out.println("methodA结束了!");
					return ;
				}
			}
			
		}
	}
	
	public void methodB(){
		synchronized (lock) {
			System.out.println("methodB开始了!");
			share='B';
			while(true){
				try {
//					lock.notify();
					Thread.yield();
				} catch (Exception e) {
					e.printStackTrace();
				}
				if(share!='B'){
					System.out.println("methodB结束了!");
					return ;
				}
			}
			
		}
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值