要解决上一篇博客中的数据不安却问题,最简单的方法就是使用synchronized关键字
(synchronized可以使用在同步块上,也可用于方法上,)
class MyThread8 implements Runnable {
private int t = 5;
@Override
public void run() {
for(int i = 0; i<10; i++)
/*使用synchronized关键字,(this表示对当前对象同步)*/
synchronized (this) {
if(t > 0) {
try {
Thread.currentThread().sleep(100);
System.out.println( Thread.currentThread().getName() +": "+t--);
} catch(Exception e) {}
}
}
}
}
public class test4 {
public static void main(String g[]) {
MyThread8 m1 = new MyThread8();
Thread t1 = new Thread(m1,"线程1");
Thread t2 = new Thread(m1,"线程2");
Thread t3 = new Thread(m1,"线程3");
t1.start();
t2.start();
t3.start();
}
}
结果:
,
还可以通过同步方法解决(使用synchronized关键字定义方法)
class MyThread8 implements Runnable {
private int t = 5;
private synchronized void test() {
for(int i = 0; i<50; i++)
if(t > 0) {
try {
Thread.currentThread().sleep(100);
System.out.println( Thread.currentThread().getName() +": "+t--);
} catch(Exception e) {}
}
}
@Override
public void run() {
test();
}
}
public class test4 {
public static void main(String g[]) {
MyThread8 m1 = new MyThread8();
Thread t1 = new Thread(m1,"线程1");
Thread t2 = new Thread(m1,"线程2");
t2.start();t1.start();
}
}
结果:
简单的解决就是这样..
同步引入之后,就是死锁,
如果两个线程同时需要A,B资源,
线程1有A资源,等待B资源,
线程2有B资源,等待A资源,这样两个线程都等待就会造成谁也得不到谁的资源,一直僵持下去,这就是死锁。
计算机操作系统中有详细讲解消除死锁的方法,好好看书……