简介

Java中每个对象都可以作为锁,这也是synchronized实现同步的基础。当线程试图访问同步代码时,首先必须要先获得对象锁,且抛出异常或退出时必须释放锁。synchronized实现同步的方式分为:同步方法和同步代码块。

synchronized原理

JVM基于进入和退出Monitor对象来实现同步代码块和同步方法,但是在细节上有所区分。
同步代码块:在编译后通过将monitorenter指令插入到同步代码块的开始处,将monitorexit指令插入到方法结束、异常处,通过反编译字节码可以得到。任何一个对象都与monitor相关联,线程执行monitorenter指令时,会尝试获取对象对应的monitor的所有权,即获取该对象的锁。
同步方法:synchronized方法在method_info结构,有ACC_synchronized标记,线程执行时会识别该标记,获取对应的锁,实现方法同步。
虽然细节不同,但是本质上都是对一个对象的监视器monitor的获取。当遭遇到同步代码块或同步方法时,执行方法的线程必须要先获得对象的监视器monitor才能进入到同步代码块、同步方法内。若未能获得到对象的monitor,线程就会被阻塞,并进入同步队列,状态变为BLOCKED。当成功获取到监视器的线程释放锁后,会唤醒阻塞在同步队列中的线程,使之重新尝试获取对象的监视器。

synchronized使用场景

1.方法同步

public synchronized void method

锁住的是该对象,类的其中一个实例,当该对象在不同线程执行同步方法时,线程之间会互斥,达到同步效果(强调仅仅是这一个对象)。但是如果多个线程同时对该类的不同对象执行此同步方法,就不灵了,因为他们持有不同的锁。
2.代码块同步

synchronized (this){  // do something}

同上!
3.方法同步

public synchronized  static void method

锁住的是这一整个类,多个对象在多个线程调用这个static同步方法,就会线程之间互斥
4.代码块同步

synchronized (Test.Class){ //do something}

同上!
5.代码块同步

synchronized (o){ //do something}

o 可以是任意的Object对象或数组,并不一定非是它本身对象或者类,谁持有o这个锁,谁就有权利 do something

解决线程同步实例

只需要对之前的卖票案例稍加修改即可!

public class Ticket implements Runnable {private int num = 100;//假设一共有100张票@Overridepublic void run() {while (true){try {Thread.sleep(100);}catch (InterruptedException e){e.printStackTrace();}synchronized (this){if (num>0){System.out.println(Thread.currentThread().getName()+"卖了"+num--);}}}}
}
public class Nothing {public static void main(String []args){Ticket ticket = new Ticket();//4个窗口一起卖票Thread t1 = new Thread(ticket);Thread t2 = new Thread(ticket);Thread t3 = new Thread(ticket);Thread t4 = new Thread(ticket);t1.start();t2.start();t3.start();t4.start();}
}

通过同步代码块,实现了线程同步!

Java并发之synchronized关键字相关推荐

  1. 深入理解Java并发之synchronized实现原理

    [版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72828483 出自[zejian ...

  2. Java进阶1. Synchronized 关键字

    Java进阶1. Synchronized 关键字 20131025 1.关于synchronized的简介: Synchronized 关键字代表对这个方法加锁,相当于不管那一个线程,运行到这个方法 ...

  3. java排他锁关键字_Java并发之synchronized关键字深度解析(一)

    前言 近期研读路神之绝世武学,徜徉于浩瀚无垠知识之海洋,偶有攫取吉光片羽,惶恐未领略其精髓即隐入岁月深处,遂急忙记录一二,顺备来日吹cow之谈资.本小系列为并发之亲儿子-独臂狂侠synchronize ...

  4. Java多线程:synchronized关键字和Lock

    一.synchronized synchronized关键字可以用于声明方法,也可以用来声明代码块,下面分别看一下具体的场景(摘抄自<大型网站系统与Java中间件实践>) 案例一:其中fo ...

  5. Java 多线程:synchronized 关键字用法(修饰类,方法,静态方法,代码块)

    前言 在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题.synchronized就是避免这个问题的解决方法之一.除了 synchroni ...

  6. Java 并发编程—Synchronized关键字

    原文作者:liuxiaopeng 原文地址:Java并发编程:Synchronized及其实现原理 目录 一.Synchronized的基本使用 二.Synchronized 原理 三.运行结果解释 ...

  7. java synchronized_Java中synchronized关键字理解

    好记性不如烂笔头~~ 并发编程中synchronized关键字的地位很重要,很多人都称它为重量级锁.利用synchronized实现同步的基础:Java中每一个对象都可以作为锁.具体表现为以下三种形式 ...

  8. Java并发之synchronized

    synchronized关键字最主要有以下3种应用方式 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁:实例锁,一个实例一把锁 修饰静态方法,作用于当前类对象加锁,进入同步代码前要 ...

  9. java并发之synchronized实现原理及其优化

    1:synchronnized概述 synchronized修饰的方法或代码块相当于并发中的临界区,即在同一时刻jvm只允许一个线程进入执行.synchronized是通过锁机制实现同一时刻只允许一个 ...

最新文章

  1. js动态创建html控件,通过JS动态添加html控件后,添加样式以及OnClick
  2. 计算机组成原理的基础知识,计算机组成原理:基础知识部分习题解答(学习笔记)...
  3. Windows server 2003 CA配置(一)
  4. windows server 启用 vss_windows服务器常用的安全加固方法
  5. web安全---浏览器解析提交数据的过程
  6. MATLAB学习笔记(七)——MATLAB解方程与函数极值
  7. JavaScript基础(3)-JS中的面向对象、定时器、BOM、位置信息
  8. 【搜索-剪枝-偏难】PAT-天梯赛-L3-015. 球队“食物链”
  9. 面试题之TCP三次握手和四次挥手详解
  10. 展视互动签约新华网 创在线教育新蓝图
  11. 企业无线产品认证好吗
  12. 台达plc自由口通讯_台达PLC的通信协议??
  13. 架构图、用例图、流程图、时序图、类图
  14. 演示面阵激光雷达的工作原理
  15. 如何在计算机上增加一个磁盘分区,电脑怎么添加硬盘分区
  16. 推荐系列论文三:Word2vec
  17. 苹果自带计算机误删,苹果手机日历误删怎样恢复?恢复的小技巧
  18. 恒生电子股份有限公司--软件测试--《社招、校招jd、校招行程,招聘动态》整理
  19. 解析人工智能与人类智慧的求同存异
  20. 网校系统搭建的功能你知道几个?

热门文章

  1. python怎样定义一个数组_Python创建数组
  2. 深入理解jQuery的Event机制
  3. 小米MIX 3如何刷成开发版启用Root超级权限
  4. [转载] New Concept English 1——Lesson 14 What colour's your…?
  5. 组播技术中IP地址到MAC地址的映射
  6. “云计算”三部曲之二:与“云”共舞——再谈云计算
  7. REST API 支持方式
  8. Git 配置命令设置
  9. 线性表ArrayList和LinkedList源码详解。
  10. linux下批量发请求