JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。synchronized void f() { /* body */ } void f() { synchronized(this) { /* body */ } }是完全等价的。

synchronized(class)很特别,它会让另一个线程在任何需要获取class做为monitor的地方等待。class与this作为不同的监视器可以同时使用,不存在一个线程获取了class,另一个线程就不能获取该class的一切实例。

  1. 对于实例同步方法,锁是当前实例对象。
  2. 对于静态同步方法,锁是当前对象的Class对象。
  3. 对于同步方法块,锁是Synchonized括号里配置的对象。

class与this的几种情况:
synchronized(class)
synchronized(this)

线程各自获取monitor,不会有等待。

synchronized(this)
synchronized(this)

如果不同线程监视同一个实例对象,就会等待;如果不同的实例,不会等待。

synchronized(class)
synchronized(class)

如果不同线程监视同一个实例或者不同的实例对象,都会等待。

public class Thread2{public static void main(String[] args) {Job job1 = new Job();Job job2 = new Job();T1 t1 = new T1(job1);T2 t2 = new T2(job2);t1.start();t2.start();}
}class Job{public void doTest(){
//        synchronized(Job.class){synchronized (this){try {String name = Thread.currentThread().getName();System.out.println("name = "+name);Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}}}
}class T1 extends Thread{private Job job;public T1(Job job){super("A");this.job = job;}@Overridepublic void run() {job.doTest();}
}class T2 extends Thread{private Job job;public T2(Job job){super("B");this.job = job;}@Overridepublic void run() {this.job.doTest();}
}

转载自:http://blog.csdn.net/mn11201117/article/details/8712946

synchronized(class)、synchronized(this)与synchronized(object)的区别分析相关推荐

  1. synchronized(this)、synchronized(class)与synchronized(Object)的区别

    在多线程开发中,我们经常看到synchronized(this).synchronized(*.class)与synchronized(任意对象)这几种类型同步方法.但是是否知道这几种写法有什么区别了 ...

  2. synchronized原理_Java并发编程 -- synchronized保证线程安全的原理

    线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案, ...

  3. synchronized原理_Java并发编程—synchronized保证线程安全的原理分析

    前言 程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方 ...

  4. java中synchronized修饰静态方法和非静态方法有什么区别?

    Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称"对象锁". Java中每个对象都有一个锁,并且是唯一的.假设分 ...

  5. 使用synchronized修饰静态方法和非静态方法有什么区别

    前言 最近被问到了这个问题,第一次回答的也是很不好,在此参考网上答案进行整理记录.供大家学习参考. Synchronized修饰非静态方法 Synchronized修饰非静态方法,实际上是对调用该方法 ...

  6. 深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    转载自  深入Synchronized和java.util.concurrent.locks.Lock的区别详解 本篇文章是对Synchronized和java.util.concurrent.loc ...

  7. synchronized原理_面试必备—Synchronized 关键字使用、底层原理

    在并发编程中存在线程安全问题,主要原因有: 1.存在共享数据 2.多线程共同操作共享数据 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某个方法或某个代码块,同时synchro ...

  8. synchronized(this)和synchronized(.class)的理解

    synchronized(this)和synchronized(.class)的理解 synchronized(this) 验证: 同一对象的Thread(苇名一心): 不同对象的Thread(苇名一 ...

  9. 既生synchronized,何生volatile (synchronized与volatile的区别)

    既生synchronized,何生volatile (synchronized与volatile的区别) 我们知道,synchronized和volatile两个关键字是Java并发编程中经常用到的两 ...

最新文章

  1. SPOJ 1812 LCS2 - Longest Common Substring II (后缀自动机、状压DP)
  2. c++构造函数和析构函数的调用顺序研究
  3. 消费消息删除_【进阶之路】可靠消息最终一致性解决方案
  4. STL-hasmap源码
  5. 【Mybatis】MyBatis 实现多表查询
  6. Bootstrap 中: data-toggle 与 data-target 的作用
  7. 单进程架构数据库谨防隐形杀手
  8. 一款基于Netty开发的WebSocket服务器
  9. 2021年十大 web hacking 技术汇总
  10. python列表字典元祖_python列表,字典,元组常用方法和集合
  11. 使用Opencv绘制灰度直方图/对比
  12. C++生成随机数:几何分布(geometric distribution)
  13. 3.以每行一个单词的形式打印其输入
  14. Raki的读paper小记:TriggerNER: Learning with Entity Triggers as Explanations for Named Entity Recognition
  15. qdir 类似工具_实用工具——多窗口资源管理器qdir
  16. Kali linux 安装Ralink外置无线网卡
  17. Xshell脚本实现自动登陆||自动登陆的几种方式。
  18. CentOS 6忘记密码解决方法(三分钟超快o)
  19. 基于华为巴龙MH5000-31 5G工业/商业模组开发(二)
  20. 力挺京东618,马化腾用小程序给刘强东送了一份大礼!

热门文章

  1. LeetCode(1.俩数之和)JAVA
  2. 使用函数对4*4的二维数组转置
  3. 【c语言】蓝桥杯入门训练 序列求和
  4. 五种开源协议(GPL,LGPL,BSD,MIT,Apache)介绍
  5. 这是一篇优雅的Springboot2.0使用手册
  6. 阿里云E-HPC联合安世亚太、联科集团共建云超算生态
  7. 页面A使用window.open打开页面B,然后取得B的返回值
  8. 从大门看守到贴身保镖服务的安全纵深防御
  9. 安全应用与管理 中国安防下一个十年
  10. 总结一下classpath