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的匿名对象,也不能在线程类中申请一个非静态的对象当做锁芯,不然对于每个线程来讲这把锁就没有了作用。