查看本章节 查看作业目录 需求说明: 车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,要求使用同步方法保证售票过程中票数的正确性 实现思路: 创建 Java 项目,在项目中创建 SellTicketBySync 类,并实现 Runnable 接口 定义 int 类型的变量 ticket,表示剩余的车票数量,ticket 初始值为 50 创建同步方法 sellTicket().在该方法体内,判断 ticket 的值是否大于 0.如果 ticket 的值大于 0,则…
一.线程安全问题 1.产生原因 我们使用java多线程的时候,最让我们头疼的莫过于多线程引起的线程安全问题,那么线程安全问题到底是如何产生的呢?究其本质,是因为多条线程操作同一数据的过程中,破坏了数据的原子性.所谓原子性,就是不可再分性.有物理常识的小伙伴可能要反驳了,谁说原子不可再分?原子里边还有质子和中子.我们不在这里探讨物理问题,我确实也没深究过为什么被称为原子性,也许是这个原则出现的时候还没有发现质子和中子,我们只要记住在编程中所提到的原子性指的是不可再分性就好了.回到正题,为什么说破坏…
从上一章知道了多线程存在着线程安全问题,那么,如何解决线程安全问题呢? 导致出现问题的原因: A:是否是多线程环境 B:是否有共享数据 C:是否有多条语句操作共享数据 上一章的程序,上面那3条都具备,所以肯定出问题. 如何解决问题: 原因A.B肯定不能改变,所以只能改变原因C 解决问题思路: 如果把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行这个整体的时候,别的线程不能执行. 这时候就用到了java提供的:同步机制 同步代码块: synchronized(对象){  需要同步的代码…
并发(concurrency)一个并不陌生的词,简单来说,就是cpu在同一时刻执行多个任务. 而Java并发则由多线程实现的. 在jvm的世界里,线程就像不相干的平行空间,串行在虚拟机中.(当然这是比较笼统的说法,线程之间是可以交互的,他们也不一定是串行.) 多线程的存在就是压榨cpu,提高程序性能,还能减少一定的设计复杂度(用现实的时间思维设计程序). 这么说来似乎线程就是传说中的银弹了,可事实告诉我们真正的银弹并不存在. 多线程会引出很多难以避免的问题, 如死锁,脏数据,线程管理的额外开销,…
上一章说了,解决线程安全问题的实现方式1是使用同步代码块 同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行 那么,现在来说解决线程安全问题的实现方式2 同步方法:(一个方法一进去就看到代码被同步了的情况下考虑使用) 把同步关键字synchronized添加到方法上 那么,同步方法的锁对象是什么呢? 是this 如果这个同步方法是静态方法,那么这个静态同步方法的锁对象是什么呢? 是类的字节码文件对象(反射中会讲解) 现在演示的例子中,这个类的字节码…
import java.util.concurrent.locks.ReentrantLock; /** * 解决线程安全问题的方式三:Lock锁 --- JDK5.0新增 * * 1. 面试题:synchronized 与 Lock的异同? * 相同:二者都可以解决线程安全问题 * 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器 * Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock()) * * 2.优先使用顺序: *…
/** * 例子:创建三个窗口卖票,总票数为100张.使用实现Runnable接口的方式 * * 1.问题:卖票过程中,出现了重票.错票 -->出现了线程的安全问题 * 2.问题出现的原因:当某个线程操作车票的过程中,尚未操作完成时,其他线程参与进来,也操作车票. * 3.如何解决:当一个线程a在操作ticket的时候,其他线程不能参与进来.直到线程a操作完ticket时,其他 * 线程才可以开始操作ticket.这种情况即使线程a出现了阻塞,也不能被改变. * * * 4.在Java中,我们通…
给出一个问题,如下: 解决方案如下: public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWindow tw1=new TicketWindow(); //使用三个线程同时启动 Thread t1=new Thread(tw1); Thread t2=new Thread(tw1); Thread t3=new Thread(tw1); t1.start(); t2.start(); t3.s…
方式一:同步代码块 synchroized(同步监视器的对象){需要被同步的代码} package threadtest; //使用同步代码块实现Runable接口的线程 public class Ruanble { public static void main(String[] args) { //创建实现类的对象 Num num=new Num(); //将此对象作为参数传递给Thread类的构造器,创建Thread类的对象 Thread thread1 =new Thread(num);…
什么是线程安全? 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作是不会发生数据冲突问题. 抢火车的例子: 一号窗口和二号窗口同时出售火车第九九张,部分火车票会重复出售. 结论发现,多个线程共享同一个全局成员变量时,做写的操作可能会发生数据冲突问题. 二.线程安全解决办法: 问:如何解决多线程之间线程安全问题 答:使用多线程之间同步synchronized或使用锁(lock). 问:为什么使用线程同步或使…