【JAVA】多线程之synchronized 同步数据 方法

本例,开启一个公告线程处理flag变量,再开启三个线程抢夺flag变量处理。结果可以看出,三个线程分别排队等待获取flag的获取权。


package test;

public class Test1 {
	private String flag[] = {"true"};
//	private String flag = "true;
	
	class NotifyThread extends Thread {
		public NotifyThread(String name){
			super(name);
		}
		
		public void run(){
			try{
				System.out.println(getName() + " >> sleep(3000)" );
				sleep(3000);
			}catch(InterruptedException e){
				e.printStackTrace();
			}
			
			synchronized(flag){
				System.out.println(getName() + " >> flag[0] = false1" );
				flag[0] = "false";
				System.out.println(getName() + " >> flag[0] = false" );
//				flag.notifyAll();
				flag.notify();
			}
		}
	};
	
	class WaitThread extends Thread{
		public WaitThread(String name){
			super(name);
		}
		
		public void run(){
			synchronized(flag){
				System.out.println(getName() + " >> "+ flag[0]);
				while(flag[0] != "false") {
					System.out.println(getName() + " >> begin waiting!");
					long waitTime = System.currentTimeMillis();
					try{
						flag.wait();
						System.out.println(getName() + " >> 结束 wait()" );

						flag.notify();
						sleep(3000);
					}catch(InterruptedException e){
						e.printStackTrace();
					}
					waitTime = System.currentTimeMillis() - waitTime;
					System.out.println(getName() + " >> wait time : " + waitTime);
				}
				System.out.println(getName() + " >> flag[0] = false");
			}
			System.out.println(getName() + " >> synchronized(flag)");
		}
	};
	
	public static void main(String[] args) throws InterruptedException{
		System.out.println("Main Thread Run !");
		Test1 ttt = new Test1();
		NotifyThread nt = ttt.new NotifyThread("notify001");
		WaitThread wt001 = ttt.new WaitThread("waiter001");
		WaitThread wt002 = ttt.new WaitThread("waiter002");
		WaitThread wt003 = ttt.new WaitThread("waiter003");
		
		nt.start();
		wt001.start();
		wt002.start();
		wt003.start();
	}
}

运行结果:

Main Thread Run !
notify001 >> sleep(3000)
waiter001 >> true
waiter001 >> begin waiting!
waiter003 >> true
waiter003 >> begin waiting!
waiter002 >> true
waiter002 >> begin waiting!
notify001 >> flag[0] = false1
notify001 >> flag[0] = false
waiter001 >> 结束 wait()
waiter001 >> wait time : 6022
waiter001 >> flag[0] = false
waiter001 >> synchronized(flag)
waiter003 >> 结束 wait()
waiter003 >> wait time : 9034
waiter003 >> flag[0] = false
waiter003 >> synchronized(flag)
waiter002 >> 结束 wait()
waiter002 >> wait time : 12046
waiter002 >> flag[0] = false
waiter002 >> synchronized(flag)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值