在多个线程执行同一段代码时,由于数据共享的原因,可能出现线程间互相干扰的情况,可以用同步锁对同步问题进行处理,代码如下:
public class SynchronizedDemo {
private static int i = 0;
public static void main(String[] args) {
Thread[] ths = new Thread[5];
for(int i = 0; i < ths.length; i++) {
ths[i] = new Thread(new MyRunnable());
ths[i].start();
}
for (Thread th : ths) {
try {
th.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("i:" + i);
}
static class MyRunnable implements Runnable {
@Override
public void run() {
synchronized(SynchronizedDemo.class) {
//当i为0时,才加1
if (i == 0) {
try {
//为模拟出多个线程间互相干扰,人为使得线程休眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
i++;
}
}
}
}
}
运行该程序n次,只有一种打印结果,打印结果:
i:1
如果去掉同步锁synchronized(SynchronizedDemo.class),运行该程序n次,有多种打印结果:
i:5
i:4
显然i:1是需要的结果,这个示例其实就是单例设计模式中加同步锁的原因,只改变i的值一次(唯一对象实例)