首页 > 代码库 > Java多线程同步锁的理解
Java多线程同步锁的理解
ava 多线程中同步锁的主要通过synchronized的关键字来实现的。让我们从一个买票程序说起吧。
package com.day04; /** * * @author Administrator 问题描述:使用多线程的方式来模拟多个窗口买票 * */ public class SaleWindow implements Runnable { // 初始化票数10 private int ticket = 10; @Override public void run() { // 获取线程的名称,比如Thread-0,并将它截掉Thread-取0这个数字标识,为了构造下面卖票窗口名称 int threadNum = Integer.parseInt(Thread.currentThread().getName().substring(7)); String saleWindowName = "销售窗口" + threadNum; // 开始买票 while (true) { if (ticket > 0) { // 这里为了演示出线程不同步的问题,让线程睡眠一段时间,延时) try { Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(saleWindowName + " 卖 出 了 " + ticket-- + " 号 票 !"); } else { break; } } } public static void main(String[] args) { // 创建了销售窗口对象 SaleWindow sw = new SaleWindow(); // 启动线程,让第一个窗口开始买票 new Thread(sw).start(); // 启动线程,让第二个窗口开始买票 new Thread(sw).start(); // 启动线程,让第三个窗口开始买票 new Thread(sw).start(); } }
运行结果如下所示:
销售窗口2 卖 出 了 10 号 票 !
销售窗口1 卖 出 了 8 号 票 !
销售窗口0 卖 出 了 9 号 票 !
销售窗口2 卖 出 了 7 号 票 !
销售窗口1 卖 出 了 6 号 票 !
销售窗口0 卖 出 了 5 号 票 !
销售窗口2 卖 出 了 4 号 票 !
销售窗口1 卖 出 了 3 号 票 !
销售窗口0 卖 出 了 2 号 票 !
销售窗口2 卖 出 了 1 号 票 !
销售窗口1 卖 出 了 0 号 票 !《-----
销售窗口0 卖 出 了 -1 号 票 !《------
可以看到我们的程序出来了问题,上面打红色箭头所示,竟然卖出胃0号票肯-1号票了。
让我们画个图来分析一下如下所示:
通过以上分析,不难得出,造成问题原因。
Java多线程同步锁的理解
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。