在多线程开发中线程安全是需要处理的,项目中会碰到很多这种问题。
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个线程去争夺锁,如果拿得到就去执行同步代码块,如果拿不到就会一直尝试拿锁,知道拿到了再去执行同步代码块。