一、synchronized简介

synchronized 是 Java 中的关键字,是一种同步锁。它修饰的对象有以下几种:

1、修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{} 括起来的代码,作用的对象是调用这个代码块的对象; 
        2、修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
        3、修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;         4、修改一个类,其作用的范围是 synchronized 后面括号括起来的部分,作用主的对象是这个类的所有对象。

注意:虽然可以使用 synchronized 来定义方法,但 synchronized 并不属于方法定义的一部分,因此,synchronized 关键字不能被继承。如果在父类中的某个方法使用了 synchronized 关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized 关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。

二、synchronized的简单使用:多人售票案例

本例实现3个人卖30张票

/*** synchronized练习,3个人卖30张票*///第一步:创建资源类,定义属性和操作方法
class Ticket{//票的数量private int number = 30;//卖票方法public synchronized void sale(){if (number > 0){System.out.println(Thread.currentThread().getName() + "卖出票,还剩" + --number + "张票");}}
}public class SaleTicket {//第二步,创建多个线程,调用资源类中的操作方法public static void main(String[] args) {Ticket ticket = new Ticket();//线程1new Thread(new Runnable() {@Overridepublic void run() {for(int i=0; i<40; i++){//卖票ticket.sale();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}, "售票员A").start();//线程2new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 40; i++) {//卖票ticket.sale();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}, "售票员B").start();//线程3new Thread(new Runnable() {@Overridepublic void run() {for (int i = 0; i < 40; i++) {//卖票ticket.sale();try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}, "售票员C").start();}
}

运行结果:

售票员A卖出票,还剩29张票
售票员B卖出票,还剩28张票
售票员C卖出票,还剩27张票
售票员B卖出票,还剩26张票
售票员C卖出票,还剩25张票
售票员A卖出票,还剩24张票
售票员C卖出票,还剩23张票
售票员B卖出票,还剩22张票
售票员A卖出票,还剩21张票
售票员C卖出票,还剩20张票
售票员B卖出票,还剩19张票
售票员A卖出票,还剩18张票
售票员C卖出票,还剩17张票
售票员B卖出票,还剩16张票
售票员A卖出票,还剩15张票
售票员C卖出票,还剩14张票
售票员B卖出票,还剩13张票
售票员A卖出票,还剩12张票
售票员C卖出票,还剩11张票
售票员B卖出票,还剩10张票
售票员A卖出票,还剩9张票
售票员C卖出票,还剩8张票
售票员B卖出票,还剩7张票
售票员A卖出票,还剩6张票
售票员C卖出票,还剩5张票
售票员A卖出票,还剩4张票
售票员B卖出票,还剩3张票
售票员C卖出票,还剩2张票
售票员B卖出票,还剩1张票
售票员A卖出票,还剩0张票

JUC学习(一):synchronized的介绍及使用(实现多线程卖票)相关推荐

  1. JUC学习(二):Lock的介绍及使用(实现多线程卖票)

    一.Lock简介 Lock 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作.它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象.Lock 提供了比 synchron ...

  2. 【尚硅谷/周阳】JUC学习笔记

    JUC学习笔记[尚硅谷/周阳] 本文章基于B站视频教程[juc 与 jvm 并发编程 Java 必学_阳哥- 尚硅谷]进行整理记录,仅用于个人学习,交流使用. 目录标题 JUC学习笔记[尚硅谷/周阳] ...

  3. Java JUC学习 - ConcurrentLinkedDeque 详解

    Java JUC学习 - ConcurrentLinkedDeque 详解 0x00 前言 如何实现并发程序,对于Java以及其他高级语言来说都是一件并不容易的事情.在大一上学期的时候,我们学习了链表 ...

  4. Synchronized详细介绍之锁升级过程

    Synchronized详细介绍之锁升级过程 前言 线程与进程的区别 进程 线程 区别 协程 JVM线程调度原理 JVM线程调用过程 JAVA线程与内核线程的关系 源码分析 线程状态 Synchron ...

  5. JUC学习笔记(二)

    JUC学习笔记(二) volatile关键字 JMM(Java Memory Model | Java内存模型) JMM同步规定 原理 工作流程 内存模型图 volatile特点 可见性 禁止指令重排 ...

  6. Hadoop学习笔记一 简要介绍

    Hadoop学习笔记一 简要介绍 这里先大致介绍一下Hadoop.     本文大部分内容都是从官网Hadoop上来的.其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了.我的这一 ...

  7. java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍

    转载自  java并发编程(二十一)----(JUC集合)CopyOnWriteArraySet和ConcurrentSkipListSet介绍 这一节我们来接着介绍JUC集合:CopyOnWrite ...

  8. 程序如何在两个gpu卡上并行运行_深度学习分布式训练相关介绍 - Part 1 多GPU训练...

    本篇文章主要是对深度学习中运用多GPU进行训练的一些基本的知识点进行的一个梳理 文章中的内容都是经过认真地分析,并且尽量做到有所考证 抛砖引玉,希望可以给大家有更多的启发,并能有所收获 介绍 大多数时 ...

  9. MongoDB学习笔记(一) MongoDB介绍及安装

    系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     MongoDB学习笔记(二) 通过samus驱动实现基本数据操作     MongoDB学习笔记(三) 在MVC模式下通过Jq ...

最新文章

  1. Pytorch 类型错误:Expected object of type torch.FloatTensor but found type torch.cuda.FloatTensor.
  2. Logstash同步mysql一对多数据到ES(踩坑日记系列)
  3. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件
  4. 数据结构二叉树遍历求后序
  5. python怎么读取excel-python对Excel的读取
  6. 将图像转为特征值_用K均值进行图像分割
  7. linux下configure命令详细介绍(转)
  8. 道哥:我人生的两大选择,为的都是同一件事
  9. KITTI数据集下载以及处理
  10. linux netperf,Netperf 的使用与介绍
  11. 梦飞苍穹c语言答案,梦飞仙途-楔子一  决战苍穹之巅-汤圆创作
  12. wxwidgets自定义事件+调试
  13. html中图片椭圆,CSS3技巧之形状(椭圆)
  14. mybatis中大于小于号转义字符
  15. 利用python进行数据分析(第二版)_第十三章
  16. Cesium 修改geojson样式
  17. 树的深度 递归非递归实现
  18. 将Eclipse设置为中文
  19. RabbitMQ的工作模式
  20. 蚂蚁矿池宣布赞助火箭队,吴忌寒这回要把 BCH 印在 NBA 球衣上吗?

热门文章

  1. 一招解决macOS12 CleanMyMac闪退
  2. 计算机网络中的c类地址,计算机网络中C类地址的子网掩码是哪个
  3. Vue中slot与slot-scope的理解及使用
  4. 迅视财经 如何在“算法过滤”的世界里生活
  5. 腾讯天美游戏客户端 一面凉经
  6. 腾讯天美测开一面面经
  7. 插值查找(两种方法)
  8. springboot+poi支持excel版本问题
  9. LINGO实例,优化问题1
  10. Centos 7安装Harbor