从上一节中可以看到Java中多线程是不安全的,比如多人同时买票,票数会出现负数的情况;多人取钱,钱数会出现负数;多个线程操作同一个列表会出现多个线程覆盖列表统一地方的错误等;
Java中提供了解决该问题的办法:锁机制。 具体而言,
锁住当前类的话可以在方法的开头public后加上synchronized;锁住具体对象(比如只锁景区的厕所而不是整个景区)时可以用synchronized(对象){代码块}.
1.解决抢票不安全问题
public class UnsafeBuyTicket {
public static void main(String[] args) {
Myticket myticket = new Myticket();
new Thread(myticket,"用户1").start();
new Thread(myticket,"用户2").start();
new Thread(myticket,"用户3").start();
}
}
//买票的类
class Myticket implements Runnable{
private int tickets = 10;//设置总票数
boolean flag = true;//采用外部停止的方式
@Override
public void run() {
//买票
while (flag){
try {
buy();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//判断是否有票
//synchronized 同步方法,锁的是this
//这里的synchronized->Myticket
private synchronized void buy() throws InterruptedException {
while (flag){
if(tickets<=0) {
flag = false;
return;
}
//模拟延时
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"抢到了第"+tickets--+"张票");}
}