多线程基础-线程安全

在多线程开发中线程安全是需要处理的,项目中会碰到很多这种问题。

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个线程去争夺锁,如果拿得到就去执行同步代码块,如果拿不到就会一直尝试拿锁,知道拿到了再去执行同步代码块。

猜你喜欢

转载自hangzhoujava.iteye.com/blog/2312153