《Java》Java“定时器和多线程”实际应用——线程同步
一、任务目标
将任务<Java“定时器和多线程”实际应用——定时器配合多线程>中的两个线程修改为互斥的,以保证两个线程不会同时对此类属性x进行修改。
二、线程同步机制
在Java中提供了同步机制,可以有效地防止资源冲突。同步机制使用 synchronized 关键字。关于 synchronized 关键字的使用有两种方法:
- 同步块
synchronized(Object){
}
将共享资源的操作放置在 synchronized 定于的区域内,这样当其他线程也取到这个锁时,必须等待锁被释放时才能进入该区域。Object 为任意一个对象,每个对象都存在一个标志位,并具有两个值,分别为 0 和 1 。0 表明此同步块中存在线程在运行,需要等待,当标志位为 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
}
}
运行结果: