《Java》Java“定时器和多线程”实际应用——线程同步

一、任务目标

    将任务<Java“定时器和多线程”实际应用——定时器配合多线程>中的两个线程修改为互斥的,以保证两个线程不会同时对此类属性x进行修改。

二、线程同步机制

    在Java中提供了同步机制,可以有效地防止资源冲突。同步机制使用 synchronized 关键字。关于 synchronized 关键字的使用有两种方法:

  1. 同步块
synchronized(Object){

}

    将共享资源的操作放置在 synchronized 定于的区域内,这样当其他线程也取到这个锁时,必须等待锁被释放时才能进入该区域。Object 为任意一个对象,每个对象都存在一个标志位,并具有两个值,分别为 0 和 1 。0 表明此同步块中存在线程在运行,需要等待,当标志位为 1 时,表明次同步块中无线程执行,前来访问次同步块的线程可以执行同步块中的内容。

  1. 同步方法
synchronized void f(){

}

当某个对象调用了同步方法时,该对象上的其他方法必须等待该同步方法执行完毕后才能被执行。必须将每个能被访问共享资源的方法修饰为 synchronized ,否则就会出错。

三、代码实现

程序代码:

import java.lang.Thread; //导入Thread类
import java.util.Timer; //导入Timer类
import java.util.TimerTask; //导入TimerTask类

public class ThreadSafeTest{ //创建ThreadSafeTest类
	/**
	 * @param args
	 */
	static double x = 0; //定义双精度型变量x
	static boolean flag1 = false;
	static boolean flag2 = false;
	
	public synchronized static void add(){ //定义同步方法
		if(flag1){ 
			x += 1.0;
			System.out.println("当前x的值为::"+x);
			flag1 = false;
		}
		else if(flag2){ 
			x += 0.1;
			System.out.println("当前x的值为::"+x);
			flag2 = false;
		}
	}
	
	public static class T1 extends Thread{ //指定T1继承Thread类
		public void run(){  //Thread的run()方法
			Timer timer1 = new Timer(); //创建Timer类对象timer
			timer1.schedule(new TimerTask(){ //schedule方法延迟300ms
				public void run(){ //TimerTask类的run()方法
					flag1 = true;
					add();
				}
			},0,300);
		}
	}

	public static class T2 extends Thread{
		public void run(){
			Timer timer2 = new Timer();
			timer2.schedule(new TimerTask(){
				public void run(){
					flag2 = true;
					add();
				}
			},0,400);
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
		
		new T1().start(); //启动线程T1
		new T2().start(); //启动线程T2
	}
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yga_airspace/article/details/83243071