您的位置:首页 > 其它

13.8 线程的安全问题和解决方法

2016-11-17 16:57 155 查看
package cn.chen.threadsecurity;
/*
出现线程安全问题的原因:
1.存在两个或两个以上的线程对象,而且线程之间共享一个资源。
2.有多个语句操作了共享资源。

java线程同步机制:
方式一:同步代码块:
同步代码块的格式:
synchronize(锁对象){
需要被同步的代码。
}
注意事项:
1.任意一个对象都可以做为一个锁对象,例如 static Object o = new Object();
2.在同步代码块中调用了sleep方法,在此过程中并不会释放锁
3.只有真正存在线程安全问题的时候才使用同步代码块,否则会降低效率。
4.多线程操作 的锁对象 必须是唯一共享的 ,否则无效。

方式二:同步函数:
后面介绍
*/
class SaleTicket extends Thread{
//设置num为静态的 //票数,非静态的成员变量,非静态的成员变量数据是在每个对象中都会维护一份数据。
static int num = 10 ;
static Object o = new Object();//锁对象
public SaleTicket(String name){
super(name);
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
while(true){
synchronized (o) {
if(num > 0){
System.out.println(Thread.currentThread().getName()+" 剩余 " +num+"号票");
num--;
try{
sleep(100);
}catch (InterruptedException e){
e.printStackTrace();
}
}else{
System.out.println("售罄");
break;
}
}
}
}

}
public class Demo {

public static void main(String[] args) {
// TODO Auto-generated method stub
//创建三个线程,模拟窗口
SaleTicket s1 = new SaleTicket("窗口1");
SaleTicket s2 = new SaleTicket("窗口2");
SaleTicket s3 =  new SaleTicket("窗口3");
s1.start();
s2.start();
s3.start();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: