同步方法和同步块
Posted 做个机灵鬼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了同步方法和同步块相关的知识,希望对你有一定的参考价值。
从上一节中可以看到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--+"张票");}
}
以上是关于同步方法和同步块的主要内容,如果未能解决你的问题,请参考以下文章
深入理解使用synchronized同步方法和同步代码块的区别