【Java】synchronized的使用

好记性不如烂笔头,————————————在我的小仓库。

承接上文,在了解Java线程是什么以及如何创建之后,我们来了解一下synchronized的使用吧

提问

【经典卖火车票问题】
即将过年了,又要到疯狂的抢票环节,每个人通过手机进入app或者网页端进行抢票,若某列车一共火车票2000张,网友们纷纷同一时间购入,排除服务器故障压力,如何控制火车票不会多卖出?

为什么会出现会卖多的问题呢?不应该获取一个卖一个,怎么会卖多呢?
我们举一个例子, 假设有ABC三个人购票,这里通过线程模拟三个人购入情况,AB线程获取到当前票数2000,A当机立断付款,当前票数1999,B发现没钱,正在往银行卡打钱,C此时网速加载好了,获取到当前的1999票数并且购入,B此时也有钱了,在已经获取到的票数上-1,因此就会出现所谓的线程不安全。

synchronized

  1. 对于同步方法,锁是当前实例对象,即this,对该类其他实例对象无影响。
  2. 对于静态同步方法,锁是当前对象的 Class 对象, 影响其他该类的实例化对象。
  3. 对于同步方法块,锁是 synchronized括号里配置的对象。
    也就是说,我们可以利用synchronized修饰类,类中的方法或者方法块。如下面的代码,分别对应上述三种情形。

使用方式

public class synchronizedTest implements Runnable {
    static synchronizedTest instance=new synchronizedTest();
    public void run() {
        synchronized(instance){ 
            //同步代码块
        }
    }
   // 类中的同步方法
   void synchronized method1() {} 
   // 类中静态同步方法
   void static synchronized method2() {} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值