多线程基础-线程安全

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值