package com.mipo.thread;/*** 线程的同步 大多数需要运行多线程的应用程序中,两个或多个线程需要共享对同一个数据的访问。* 如果每个线程都会调用一个修改该数据状态的方法,那么这些线程将会互相影响对方的运行。* 为了避免多个线程同时访问一个共享数据,可以通过关键字synchronized来加保护伞,保证数据的安全* synchronized主要运用于同步代码块和同步方法中。* * @author Administrator**/
public class ThreadTest3 {// 有一火车票售票系统,它有5个售票点,共同销售100张火车票。用多线程来模拟这个销售系统public static void main(String[] args) {TicketOffice to = new TicketOffice();Thread t1 = new Thread(to);// 创建线程t1.setName("售票点1");// 设置线程名t1.start();Thread t2 = new Thread(to);// 创建线程t2.setName("售票点2");// 设置线程名t2.start();Thread t3 = new Thread(to);// 创建线程t3.setName("售票点3");// 设置线程名t3.start();Thread t4 = new Thread(to);// 创建线程t4.setName("售票点4");// 设置线程名t4.start();Thread t5 = new Thread(to);// 创建线程t5.setName("售票点5");// 设置线程名t5.start();}}//该类只能实现Runnable接口,而不能继承Thread类(此方法在创建线程时要创建多个对象,会出问题)
class TicketOffice implements Runnable {private int tickets = 0;// 火车票计数器--成员变量public void run() {boolean flag = true;// 是否还有票可卖--局部变量while (flag) {flag = sell();// 售票}}// 同步方法:synchronized放在方法声明中,表示整个方法为同步方法public synchronized boolean sell() {// 售票方法:返回值表示是否还有票可卖boolean flag = true;if (tickets < 100) {tickets = tickets + 1;// 更改票数System.out.println(Thread.currentThread().getName() + ":卖出第" + tickets + "张票");} else {flag = false;}// 为了增大出错几率,让线程睡眠15毫秒try {Thread.sleep(15);} catch (InterruptedException e) {e.printStackTrace();}return flag;}// 同步代码块:把线程体内执行的方法中会操作到共享数据的语句封装在"{}"之内,// 然后用synchronized放在某个对象前面修饰这个代码块// 这种情况下,只是同步了会操作到共享数据的代码,比同步整个方法会更有效率/** public boolean sell() {//售票方法:返回值表示是否还有票可卖 boolean flag = true;* synchronized(this) { if (tickets < 100) { tickets = tickets + 1;//更改票数* System.out.println(Thread.currentThread().getName()+ ":卖出第"+tickets+"张票"* ); }else { flag = false; } }* * * * //为了增大出错几率,让线程睡眠15毫秒 try { sleep(15); } catch (InterruptedException e) {* e.printStackTrace(); } return flag; }* * */
}
详细解决方案
线程的同步(synchronized关键字)
热度:105 发布时间:2023-09-20 23:24:29.0
相关解决方案
- synchronized 同步方法不起作用,该如何处理
- synchronized 学习(1)
- synchronized 的有关问题,木木哒
- 一个线程加一演算,一个线程做减一运算,多个线程同时交替运行-synchronized
- synchronized 与 wait 的有关问题
- public synchronized static 获取序列号如何会主键冲突
- 请帮助解释的多线程的执行顺序有关问题,先多谢!synchronized
- synchronized 有关问题
- synchronized (this)的意思解决思路
- 关于 synchronized 的疑问解决方案
- synchronized 方法 和 synchronized代码块 竞争的是同一把锁吗?解决方法
- Collections.synchronized,该如何解决
- synchronized wait notify,该怎么解决
- Java Concurrent--线程安全性(synchronized)
- synchronized(this)引发的线程不安全问题
- synchronized 和 ReentrantLock 的区别
- synchronized and Lock
- 《java笔记系列》synchronized
- synchronized、volatile、CAS 比较
- 为 什 么 说 Synchronized 是 一 个 悲 观 锁 ?
- 跟 Synchronized 相比,可重入锁 ReentrantLock 其实现原理有什么不同?
- 请尽可能详尽地对比下 Synchronized 和 ReentrantLock 的异同
- 为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?
- 为什么说 Synchronized 是非公平锁?
- 什么是可重入性,为什么说 Synchronized 是可重入锁?
- Synchronized 用过吗,其原理是什么?
- synchronized 的底层怎么实现的
- synchronized 关键字的java应用
- 单例模式之懒汉的并发问题,只需要添加一个 synchronized 就可以解决了
- synchronized 加锁保证线程安全