栗子来源:https://blog.csdn.net/wenzhi20102321/article/details/52524545

首先对java中同步锁与互斥锁进行区分,主要来源于知乎中的大佬总结如下:

1.锁的概念

锁的目的就是避免多个线程对同一个共享的数据并发修改带来的数据混乱。

锁的实现要处理的大概就只有这4个问题:(知乎大宽宽的回答,非本人观点)

  • 谁拿到了锁“这个信息存哪里(可以是当前class,当前instance的markword,还可以是某个具体的Lock的实例)
  • 谁能抢到锁的规则(只能一个人抢到 - Mutex;能抢有限多个数量 - Semaphore;自己可以反复抢 - 重入锁;读可以反复抢到但是写独占 - 读写锁……)
  • 抢不到时怎么办(抢不到玩命抢;抢不到暂时睡着,等一段时间再试/等通知再试;或者二者的结合,先玩命抢几次,还没抢到就睡着)
  • 如果锁被释放了还有其他等待锁的怎么办(不管,让等的线程通过超时机制自己抢;按照一定规则通知某一个等待的线程;通知所有线程唤醒他们,让他们一起抢……)

2.互斥与同步

互斥锁与同步锁的区别:(知乎:chen Kingwen的回答

互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。

3.java中synchronized实现同步锁

synchronized为java中实现同步锁的关键字,可以以下几种对象、代码块、方法、类

  • 代码块:被修饰的代码块为同步代码块,调用该代码块的对象是同步锁的操作对象
  • 方法:被修饰的方法为同步方法,调用该方法的对象为同步锁的操作对象
  • 静态方法:被static关键字修饰的方法属于类,那同步锁修饰的静态方法自然被操作对象为该类的所有实例对象
  • 类:被修饰的类为同步类,该类的所有实例对象为同步锁的操作对象

4.实例(该实例来源于https://blog.csdn.net/wenzhi20102321/article/details/52524545

使用同步锁及多线程实现模拟三台售票机售出同批次票:

/** 三个售票窗口同时售卖20张票* 1.票数使用同一个静态值* 2.保证不出现卖出同一个票数,java多线程同步锁*/
public class Station extends Thread {public Station(String name) {super(name);//名字就以线程名进行命名}static int tick=20;//表示这个票数归类所有static Object ob="aa";//静态钥匙,值是任意public void run() {while(tick>0) {synchronized(ob) {//synchronized同步锁,以下钥匙aa为同步静态对象,这就解释了为什么定义为Objectif(tick>0) {System.out.println(getName()+"卖出了第"+(21-tick)+"张票");tick--;}else {System.out.println("票卖完了");}}try {sleep(1000);}catch(InterruptedException e) {e.printStackTrace();}}}
}

调用的主类:


public class Main_class {/*** java多线程同步锁的应用* @param args*/public static void main(String[] args) {// TODO Auto-generated method stubStation station1=new Station("窗口1");Station station2=new Station("窗口2");Station station3=new Station("窗口3");station1.start();station2.start();station3.start();                                                       }}

演示结果:

Java线程学习实例——采用同步锁,互斥锁与同步锁的区别,synchronized的使用方法相关推荐

  1. 写出记录型信号量中的wait操作代码_操作系统进程的同步与互斥及经典同步与互斥问题...

    概览 临界区临界区的引入 在系统当中,有些资源允许多个进程共享(磁盘),有些资源只允许进程单独使用(打印机,共享变量).为了让进程单独使用资源而不受其他进程干扰引入了临界区的概念. 临界区的概念 在一 ...

  2. java线程学习记录

    线程 什么是线程? 线程是一个轻量级的子进程,是最小的处理单元.多线程和多进程都用于实现多任务处理.但是,我们使用多线程而不是多进程,因为线程使用共享内存区域,它们不分配单独的内存区域以节省内存,而且 ...

  3. java线程学习(二):线程池

    本章继续深入学习线程-线程池 线程池的基本概念 JDK5之前,都是程序员自己手动创建线程池,JDK5之后,内置线程池技术. 什么是线程池呢? 可以简单理解成容纳多个线程的容器,其中的线程是可以反复使用 ...

  4. java线程学习,GitHub - zksir/thread: Java多线程学习

    Java多线程学习 threadcoreknowledge包----线程核心知识基础 createthreads包 创建线程 1.实现多线程的方法是1种还是2种还是4种? Oracle官方:2种,一种 ...

  5. java线程学习-Thread.currentTread().getName()和this.getName()的区别

    很久没有写java程序了,由于为了改变目前的状况,打算花两天时间学习一下java的线程开发和高并发. 线程开发使用thread类,或者runnable接口,而且thread类也是实现了runnable ...

  6. java线程学习之notify方法和notifyAll方法

    notify(通知)方法,会将等待队列中的一个线程取出.比如obj.notify();那么obj的等待队列中就会有一个线程选中并且唤醒,然后被唤醒的队列就会退出等待队列.活跃线程调用等待队列中的线程时 ...

  7. win32线程学习总结(临界区,互斥体,事件,信号量)

    一.临界区 CRITICAL_SECTION 例程 https://blog.csdn.net/Kwansy/article/details/106485496 临界区用于资源互斥访问,性能比互斥体好 ...

  8. Java线程学习笔记(两) 线程异常处理

    线程捕获异常: 情况下,我们在main()方法里是捕捉不到线程的异常的,比例如以下面代码: public class ExceptionThread implements Runnable{@Over ...

  9. java线程学习第一天__低配版的卖面包机

    package Thread; import javax.xml.bind.ValidationEvent; class snacks{     private int  SaledSnacks=0; ...

最新文章

  1. 检查联网状态并设置网络
  2. java actor模型实例,详解Theron通过Actor模型解决C++并发编程的一种思维
  3. java 动态拼接sql_动态SQL拼接工具类
  4. excel平均值公式_投资组合Normal VaR的具体计算方法(Excel版)
  5. 遍历Windows系统的内核模块(源码)
  6. html 怎么设置cooki,怎么设置浏览器接受cookie
  7. flux_Flux建筑模式简介
  8. 融合应急指挥调度系统
  9. js验证身份证营业执照组织机构代码等
  10. 个人博客系统需求文档
  11. JavaScript模板引擎
  12. [NOI 2014]起床困难综合症
  13. 基于图像识别的火灾探测技术
  14. jsp复习题库(1)
  15. 使用树莓派实现微信远程监控
  16. java初步语法(一)数据类型
  17. 相似图片搜索中的均值哈希(aHash)
  18. 响应式设计:理解设备像素,CSS像素和屏幕分辨率
  19. 二氧化硅改性活性炭|SiO2改性的V2O5-MoO3/TiO2催化剂|SiO2改性MCM-22分子筛上联苯|纳米SiO2改性环氧涂层海洋腐蚀规律
  20. git commit -m 提交忽略代码校验

热门文章

  1. java高铁在线购票系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
  2. JSON格式简介及一些对应函数
  3. python控制投影仪的代码
  4. 关于unity客户端防作弊(内存数据被修改)
  5. 怎样通过Mac键盘在iPhone、iPad上快速打字?
  6. solidity 合约入金出金(eth)
  7. 蝙蝠侠遥控器pcb_通过蝙蝠侠从Circle到ML:第二部分
  8. 影响百万人就业、价值6万亿的“大生意”是这样落地的
  9. 车辆停车场代码,可实现车辆的出入和停车场信息查询
  10. linux 命令run road,linux命令进阶