使用环境:多线程java程序中。

作用:在多线程的环境下,控制synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。

使用:synchronized锁住的是括号里的对象,而不是代码。对于非static的synchronized方法,锁的就是对象本身也就是this。

通过以下两个案例说明:

//包含了synchronized 方法的类
public class SynchronizedMethod {public synchronized void test(){System.out.println("线程开始..");try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}System.out.println("线程结束..");}
}//测试类
public class MyThread extends Thread{public void run(){SynchronizedMethod clazz = new SynchronizedMethod();clazz.test();}public static void main(String[] args) {for(int i=0;i<3;i++){Thread thread = new MyThread();thread.start();}}}

执行结果:

线程开始..
线程开始..
线程开始..
线程结束..
线程结束..
线程结束..

分析上述执行结果可知:

  当main方法执行时,分别创建了三个MyThread对象,而这三个对象又各自创建了独立的 SynchronizedMethred类,虽然使用了test方法使用了synchronized方法修饰,但是synchronized锁住的是三个独立的对象,因为三个对象各自分别执行了test方法。

因此,可以修改代码,让三个线程使用同一个SynchronizedMethod对象:

 1 //修改测试类代码如下,使用同一对象调用test方法
 2
 3 public class MyThread extends Thread{
 4
 5     /**
 6      * Author:LearnAndGet
 7      */
 8     private SynchronizedMethod sync;
 9     public MyThread(SynchronizedMethod sync)
10     {
11         this.sync = sync;
12     }
13
14     public void run(){
15         sync.test();
16     }
17
18
19     public static void main(String[] args) {
20         SynchronizedMethod sync = new SynchronizedMethod();
21         for(int i=0;i<3;i++)
22         {
23             MyThread thread = new MyThread(sync);
24             thread.start();
25         }
26     }
27 }

 运行结果:

线程开始..
线程结束..
线程开始..
线程结束..
线程开始..
线程结束..

分析上述结果:由于每次新线程启动,使用的同一对象sync,因此synchronized生效了。

当然,更常用的方法是:使用schronized锁住这个类对应的Class对象:

public class SynchronizedMethod {public void test(){//将代码块使用synchronized锁住synchronized(SynchronizedMethod.class){System.out.println("线程开始..");try {Thread.sleep(2000);} catch (Exception e) {e.printStackTrace();}System.out.println("线程结束..");}}
}

使用上述代码后,即使每次创建不同的SynchronizedMethod对象,执行其test方法时,因为synchronized锁住了SynchronizedMethod类对应的class对象,所以每次只能有一个SynchronizedMethod的对象获取锁,直到该锁获得释放,其他SynchronizedMethod对象都无法执行其方法。

上述代码中,通过使用 synchronized(SynchronizedMethod.class)实现了全局锁的效果

除此之外,使用 static synchronized一起修饰方法时,static方法可以直接类名加方法名调用,方法中无法使用this,所以它锁的不是this,而是类的Class对象,所以,static synchronized方法也相当于全局锁,相当于锁住了代码段。

转载于:https://www.cnblogs.com/LearnAndGet/p/9365752.html

Java synchronized到底锁住的是什么?相关推荐

  1. Java Synchronized 重量级锁原理深入剖析上(互斥篇)

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  2. Java Synchronized 偏向锁/轻量级锁/重量级锁的演变过程

    前言 线程并发系列文章: Java 线程基础 Java 线程状态 Java "优雅"地中断线程-实践篇 Java "优雅"地中断线程-原理篇 真正理解Java ...

  3. 透彻理解 Java synchronized 对象锁和类锁的区别

    synchronized 加到 static 方法前面是给class 加锁,即类锁:而synchronized 加到非静态方法前面是给对象上锁.这两者的区别我用代码来演示下: 对象锁和类锁是不同的锁, ...

  4. 【转】【MySQL】事务与锁(四):行锁到底锁住的是什么?记录?字段?索引?

    首先我们有三张表t1,t2,t3,它们都是只有两个字段, int类型的id和varchar类型的name:区别是t1没有索引,t2有主键索引,t3有唯一索引. 再强调一次,在实验前必须提前关闭自动提交 ...

  5. java synchronized 类锁_【java】synchronized对象锁和类锁简介【图文教程】

    平凡也就两个字: 懒和惰; 成功也就两个字: 苦和勤; 优秀也就两个字: 你和我. 跟着我从0学习JAVA.spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美! 关注微信 ...

  6. Java synchronized偏向锁、轻量级锁、重量级锁

    简介 synchronized锁共有偏向锁.轻量级锁.重量级锁三种类型,而这三种类型的加锁方式都是相同的,写代码时不用考虑加哪种锁.使用锁时对象首先会变为偏向锁状态,当有其它线程获取锁时会升级为轻量级 ...

  7. java synchronized关键字锁和锁类型、锁升级过程讲解

    概述 synchronized是java的一个关键字,用于对方法或者代码块添加一个同步锁,以实现操作的原子性,保证线程安全性,但是却会带来一些性能上的损耗. 这个关键字添加的是可重入锁,也就是同一个线 ...

  8. JAVA synchronized关键字锁机制(中)

    synchronized 锁机制简单的用法,高效的执行效率使成为解决线程安全的首选. 下面总结其特性以及使用技巧,加深对其理解. 特性: 1. Java语言的关键字,当它用来修饰一个方法或者一个代码块 ...

  9. Java synchronized偏向锁后hashcode存在哪里?

    今天的文章从下面这张图片开始,这张图片Java开发们应该很熟悉了 我们都知道无锁状态是对象头是有位置存储hashcode的,而变为偏向锁状态是没有位置存储hashcode的,今天我们来通过实现验证这个 ...

最新文章

  1. JAVA获取资源的方法
  2. Watcher 实现机制之client注冊
  3. 重磅!Spring Boot 2.5.0火热发布,还学得动吗?
  4. Hive _分桶及抽样查询
  5. [设计模式]迪米特法则
  6. C#设计模式之单例模式
  7. SMS部署操作系统后记
  8. 95-40-014-生产者-KafkaProducer
  9. 微信机器人wxpy简单实例Python
  10. 用户控件与自定义控件
  11. liux环境下配置jdk
  12. matlab经验分布函数 教程,经验分布函数.ppt
  13. 北风修仙笔记—2020年6月
  14. 前端 Coder 手中的 Docker
  15. php 远程下载木马
  16. 逆透视变换车道线检测
  17. 离散数学计算机专业论文,计算机与离散数学论文.doc
  18. 计算机毕业设计(附源码)python校园招聘管理系统
  19. php办公网聊天室,使用phpFreeChat在您的网站上运行聊天室 | MOS86
  20. 微信聊天视频25M压制指南

热门文章

  1. 每个前端工程师都应该去了解的前端面试题总结(一)
  2. 【Vue】组件的创建以及 data methods 属性的使用
  3. 入门机器学习(六)--课后作业解析-logistics回归(python实现)
  4. 浅说机器学习中“迭代法”
  5. python tcp服务器模板_python socket之tcp服务器与客户端示例
  6. Integer进制转换
  7. ESRI ArcGIS 9.0系列软件报价(转)
  8. BZOJ1095: [ZJOI2007]Hide 捉迷藏(动态点分治)
  9. 用户不在sudoers文件中,此事将被报告
  10. PHP7 网络编程(四)signal信号【待】