线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

方式一:使用Runnable接口

/**

* 例子:创建三个窗口买票,总票数为100张 ——> 使用实现Runnable接口的方式

*/

class Window1 implements Runnable{

private int ticket = 10000;

@Override

public void run() {

while(true){

if(ticket > 0){

System.out.println(Thread.currentThread().getName() + ":买票,票号为:" + ticket);

ticket--;

}else {

break;

}

}

}

}

public class WindowTest {

public static void main(String[] args) {

Window1 w = new Window1();

Thread t1 = new Thread(w);

Thread t2 = new Thread(w);

Thread t3 = new Thread(w);

t1.setName("窗口1");

t2.setName("窗口2");

t3.setName("窗口3");

t1.start();

t2.start();

t3.start();

}

}

方式二:使用线程同步机制(线程安全处理Synchronized,只有一个锁)

线程同步的方式有两种:

方式1:同步代码块

方式2:同步方法

使用同步代码块

public class ThreadTest {

public static void main(String[] args) {

Ticket t = new Ticket();

Thread th1 = new Thread(t);

Thread th2 = new Thread(t);

Thread th3 = new Thread(t);

th1.setName("窗口1");

th2.setName("窗口2");

th3.setName("窗口3");

th1.start();

th2.start();

th3.start();

}

}

class Ticket implements Runnable{

// 定义票根

int ticket = 100;

Object lock = new Object();

@Override

public void run() {

while(true){

// synchronized中的的参数可以为任意对象

synchronized (lock) {

if(ticket > 0){

// 模拟选座的操作

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket);

ticket--;

}else{

break;

}

}

}

}

}

使用同步方法

public class ThreadTest {

public static void main(String[] args) {

Ticket t = new Ticket();

Thread th1 = new Thread(t);

Thread th2 = new Thread(t);

Thread th3 = new Thread(t);

th1.setName("窗口1");

th2.setName("窗口2");

th3.setName("窗口3");

th1.start();

th2.start();

th3.start();

}

}

class Ticket implements Runnable{

// 定义票根

int ticket = 100;

@Override

public void run() {

while(true){

// 同步方法

boolean method = method();

if(method){

break;

}

}

}

// 同步方法中的锁对象是 this

// 静态同步方法中的锁对象是 类名.class

public synchronized boolean method() {

boolean flag = false;

if(ticket > 0){

// 模拟选座的操作

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + "正在卖票:" + ticket);

ticket--;

}else{

flag = true;

}

return flag;

}

}

java 买票_Java—买票窗口相关推荐

  1. java jframe教程_Java Swing JFrame窗口的实现

    1. 概述 官方JavaDocsApi: javax.swing.JFrame JFrame,窗口.JFrame 是一个可以独立显示的组件,一个窗口通常包含有标题.图标.操作按钮(关闭.最小化.最大化 ...

  2. java输出希腊字母_java 命令行窗口输出希腊字母表

    /** * @author Administrator * 编写程序,命令行窗口输出希腊字母表.(希腊字母表开始为α,最后一个为ω) */ public class OutGreekLetter { ...

  3. Java线程同步-模拟买票

    文章首发于 2020-11-29 知乎文章:Java线程同步-模拟买票 作者:落雨湿红尘(也是我o) 01 导语 本文使用JAVA代码模拟买票场景下的业务交互,通过示例讲解线程的初始化.线程同步等ja ...

  4. Java实现买火车票【抢票】成功率100%

    还在为买不到过年回家的车票而着急吗?通过Java的爬虫和数据分析可以帮我们买到回家的票. 准备:Java开发环境. 场景:一根韭菜要从于2020年01月23日乘火车从北京到山东聊城 第一步:爬取202 ...

  5. java多线程举例买票之买电影票出现的了相同的票和负数票的原因分析和解决方法

    package cn.itcast_03; /** 我们在前面讲解的电影院售票程序,从表面上看,没什么问题* 但是在,真实的生活中,售票时网络时不能实时传输* 会有延迟的* * 通过加入延迟,就产生了 ...

  6. 12306出票时间表,买别人买不到的票

    12306出票时间表,买别人买不到的票 12306几点放票?大家可以看看网友整理的12306放票时间,仅供参考. 1.提前20天晚上19:00,放20天后的动车组车票和Z字头车票.这个时间,一般不会有 ...

  7. OSChina 周日乱弹 —— 恨不得给你买张飞机挂票

    2019独角兽企业重金招聘Python工程师标准>>> Osc乱弹歌单(2018)请戳(这里) [今日歌曲] @开源中国首席灵魂师:分享张希/曹方的单曲<认真地老去> 来 ...

  8. 已经发车的票还能取出来吗_我买了张高铁票(已付过钱),但是车已经开了,我没上车,票也没取,还能在取出票吗?...

    展开全部 这种情况是可以取出票的. 在12306.cn网站使用居民身份证购票,并且在具备条件的乘车站和下车站使用居民身份证通过自动e68a84e8a2ad32313133353236313431303 ...

  9. 3个窗口卖票java_三个窗口同时卖火车票,如何用代码将该场景实现?

    今天是我自学Java的第33天. 感谢你的陪伴,你的陪伴便是对我最大的鼓励. 话不多说,开始今天的学习:线程同步. 想必很多小伙伴应该都经历过去火车站买票的情况. 现有一个案例:火车站有3个售票窗口, ...

最新文章

  1. 《搬砖日记》Obi Rope插件的简单使用
  2. 雅虎开源发布/订阅消息平台Pulsar
  3. 深入了解webservice_概念总结
  4. 大数据_Hbase-(知识点回顾)---Hbase工作笔记0010
  5. java系列10:ArrayList
  6. Flink中task之间的数据交换机制
  7. python通过jdbc连接hive_Python使用JDBC连接Hive
  8. 一阶倒立摆的起摆与稳摆simulink仿真
  9. 深圳杯2020数学建模C题 遗传算法
  10. Java工作流引擎:jBPM、Activiti以及SWF
  11. C#报错Newtonsoft.Json.JsonSerializationException: “A member with the name ‘phone‘ already
  12. 一个简单的HTML5后台登陆界面及登录实现
  13. 你是否真的明白Duble与double
  14. 百度地图点击城市的出现下钻
  15. unity开发记录:TextMeshPro设置显示中文
  16. python eel 安卓_测试Eel——进行py与js文件数据传输
  17. android屏幕旋转生命周期,Activity、Fragment生命周期---横竖屏切换的生命周期
  18. Redis常用命令入门4:集合类型
  19. 尼康d850相机参数测试软件,尼康(Nikon)D850 单机数码相机宽容度评测-ZOL中关村在线...
  20. qmail于redhat9安装记录(转)

热门文章

  1. 2023年天津专升本文化课考试成绩查询时间
  2. JS 手机号、姓名、身份证号脱敏处理
  3. mongodump 3.0.7
  4. C++中sstream类
  5. Linux下QT安装笔记
  6. LaTeX Beamer 模板
  7. ceph PG状态及部分故障(状态)模拟
  8. linux 查看用户的uid和gid
  9. 如何运营好一个微社区?热门手游社区助力游戏玩家互动
  10. 互联网大厂跑马圈地虚拟数字人,千亿市场爆发至少还要等上5年?