线程安全问题

5月12日java学习笔记

多线程的实际运用中解决安全问题

举例:车站三个窗口同时卖50张车票
run()中卖票代码
”’
while(true) {
synchronized (“锁”) {
if (ticketname > 0) {
System.out.println(Thread.currentThread().getName() + “售出第” + (51 - ticketname) + “号票”);
ticketname–;
} else {
System.out.println(Thread.currentThread().getName() + “票已售罄”);
break;
}
}
}
”’

1,首先创建一个线程对象,车票申请为静态数据,三个线程共享。重写run()方法为卖票过程。

2,主函数中创建上线程对象,分别为三个对象命名,方便区分卖出票的窗口,同时调用start()方法。
此时出现问题,出现线程安全问题,比如三个窗口都卖出了一号票,因为运行过程中,线程抢夺随时发生,所以导致出现安全问题,比如线程1刚刚判断ticketname,还没打印语句,线程2就抢过去判断,然后线程3又抢过去判断,导致最后三个线程都输出了1号票

3,为解决线程问题,sun公司引入了synchronized(){}对象锁住大括号类区域类的代码,当一个线程进入锁区域以后会锁起这个区域,其他线程只能在外面等待,当进入内部的线程执行完以后出大括号区域,再开锁,所有线程再一起抢夺执行权。

synchronized(){}:
1,原理与方法:大括号内部就包括需要锁住的代码区,小括号里面引入一个对象,每个对象都存在一种状态,这个状态就作为锁的开关标志,0为开,1为关。
2,注意点:对于括号中的对象,需要带入一个共享唯一的对象,可以在线程类中申请一个静态的对象当做这个锁芯,或者直接在里面加一个字符串,但要注意的是,不能用new的匿名对象,也不能在线程类中申请一个非静态的对象当做锁芯,不然对于每个线程来讲这把锁就没有了作用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值