在多线程开发中线程安全是需要处理的,项目中会碰到很多这种问题。
1 变量共享
例子1:
public class SecThread extends Thread{
private int count = 99;
public SecThread(String name) {
this.setName(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
count--;
System.out.println(Thread.currentThread().getName()+" count:"+count);
}
public static void main(String[] args) {
SecThread at = new SecThread("A");
SecThread bt = new SecThread("B");
at.start();
bt.start();
}
}
从结果看变量显然没有共享,共享变量目的是为了让多个线程对同一个变量操作,例子里他们都有各自的count
换一种方式
public static void main(String[] args) {
SecThread st = new SecThread();
Thread at = new Thread(st,"A");
Thread bt = new Thread(st,"B");
at.start();
bt.start();
}
执行结果出乎意料。98 97, 97 97 不知道下一步是产生哪个结果。
上面例子的变量都不安全。
解决方法 加synchronized关键字,这样的话多线程在执行run的时候,会先去判断一下是否被上锁,如果上锁了,说明其他线程在调用着,需要等待其他线程调用玩才可以执行run
该例有2个线程去争夺锁,如果拿得到就去执行同步代码块,如果拿不到就会一直尝试拿锁,知道拿到了再去执行同步代码块。