一  对象锁和类锁的关系

  1. /*
  2. *
  3. 对象锁和【类锁】 全局锁的关系?
  4. 对象锁是用于对象实例方法,或者一个对象实例上的 this
  5. 类锁是用于类的静态方法或者一个类的class对象上的。 Ag.class
  6.  
  7. 我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,
  8. 所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
  9. */

对象锁,  不同对象。

  1. public class SynchrDemo {
  2. public static void main(String[] args) {
  3.  
  4. Thread1 thread1 = new Thread1();
  5. Thread1 thread2 = new Thread1();
  6.  
  7. thread1.start();
  8. thread2.start();
  9.  
  10. }
  11. }
  12.  
  13. class Ag{
  14. public void show(){
  15. // this 是当前对象的实例,由于新建两个对象,不是同一对象。所以这里是锁不住的。 代码快的方式,比修饰在方法上更细化控制。
  16. synchronized (this) {
  17. for (int i = 0; i < 4; i++) {
  18. System.out.println(Thread.currentThread().getName() + " i=" + i);
  19. }
  20. }
  21. }
  22.  
  23. }
  24.  
  25. class Thread1 extends Thread{
  26. @Override
  27. public void run() {
  28. //这里是新建对象 主方法中new了两个thread,就是new了两个Ag对象
  29. Ag ag = new Ag();
  30. ag.show();
  31.  
  32. }
  33. }

关键字修饰方法

  1. public class SynchrDemo {
  2. public static void main(String[] args) {
  3.  
  4. Thread1 thread1 = new Thread1();
  5. Thread1 thread2 = new Thread1();
  6.  
  7. thread1.start();
  8. thread2.start();
  9.  
  10. }
  11. }
  12.  
  13. class Ag{
  14. // 这次修饰的是方法,范围比代码块要大,意味着在这个区域内,锁生效的时候,都是在阻塞,其他线程的等待时间就会增加。
  15. // 这次实验的非同一对象,所以这里的锁是不起作用的。
  16. public synchronized void show(){
  17. for (int i = 0; i < 4; i++) {
  18. System.out.println(Thread.currentThread().getName() + " i=" + i);
  19. }
  20. }
  21.  
  22. }
  23.  
  24. class Thread1 extends Thread{
  25. @Override
  26. public void run() {
  27. //这里是新建对象 主方法中new了两个thread,就是new了两个Ag对象
  28. Ag ag = new Ag();
  29. ag.show();
  30.  
  31. }
  32. }

二  对象锁  同一对象

  1. package com.aaa.threaddemo;
  2. /*
  3. * 一 Java中的关键字 synchronized 是啥?
  4. * synchronized是Java提供的一个并发控制的关键字。
  5. *
  6. * 用法:同步方法 和 同步代码块。
  7. * 可以修饰方法 也可以 修饰代码块。
  8. *
  9. * 作用: 被synchronized修饰的代码块及方法,在同一时间,只能被单个线程访问。【保证线程安全】
  10.  
  11. 1 修饰方法和代码块有什么不同?
  12. 二者的结果是一样的
  13.  
  14. 修饰方法时,作用域是整个方法,控制的范围大。
  15.  
  16. synchronized 代码块 可控制具体的作用域,更精准控制提高效率。
  17. 减少阻塞带来的时间问题。
  18.  
  19. 2 同步锁的给谁用的?
  20. 同步锁基于对象,只要锁的来源一致,即可达到同步的作用。
  21. 所以,但对象不一样,则不能达到同步效果。
  22.  
  23. 3 synchronized修饰方法,代码块,锁未释放,此时,其他线程调用同一对象的其他被synchronized修饰的方法,代码块,会如何?
  24. 当线程 A 调用某对象的synchronized 方法 或者 synchronized 代码块时,若同步锁未释放,
  25. 其他线程调用同一对象的其他 synchronized 方法 或者 synchronized 代码块时将被阻塞,直至线程 A 释放该对象的同步锁。(注意:重点是其他)
  26.  
  27. 4 调用非synchronized方法 ,代码快呢?
  28. 当线程 A 调用某对象的synchronized 方法 或者 synchronized 代码块时,无论同步锁是否释放,
  29. 其他线程调用同一对象的其他 非 synchronized 方法 或者 非 synchronized 代码块时可立即调用。
  30.  
  31. 5 全局锁如何实现?
  32. 全局锁: 锁住整个 Class,而非某个对象或实例。1-4都是实例锁
  33. 实现: 静态 synchronized 方法
  34.  
  35. static 声明的方法为全局方法,与对象实例化无关,
  36. 所以 static synchronized 方法为全局同步方法,与对象实例化无关。
  37.  
  38. 6 synchronized 具体 Class 的代码块?
  39. synchronized (Ag.class) 获得的同步锁是全局的,
  40. static synchronized 获得的同步锁也是全局的,同一个锁,所以达到同步效果。
  41.  
  42. 7 对象锁和【类锁】 全局锁的关系?
  43. 对象锁是用于对象实例方法,或者一个对象实例上的 this
  44. 类锁是用于类的静态方法或者一个类的class对象上的。 Ag.class
  45.  
  46. 我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,
  47. 所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
  48.  
  49. *
  50. *
  51. */
  52.  
  53. /*
  54. *
  55. 对象锁和【类锁】 全局锁的关系?
  56. 对象锁是用于对象实例方法,或者一个对象实例上的 this
  57. 类锁是用于类的静态方法或者一个类的class对象上的。 Ag.class
  58.  
  59. 我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,
  60. 所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
  61. */
  62.  
  63. public class SynchrDemo {
  64. public static void main(String[] args) {
  65.  
  66. // 改造后,可以确保是同一对象 验证 synchronized 是否生效
  67. Ag ag = new Ag();
  68.  
  69. Thread1 thread1 = new Thread1(ag);
  70. Thread1 thread2 = new Thread1(ag);
  71.  
  72. thread1.start();
  73. thread2.start();
  74.  
  75. }
  76. }
  77.  
  78. class Ag{
  79. // 这次修饰的是方法,范围比代码块要大,意味着在这个区域内,锁生效的时候,都是在阻塞,其他线程的等待时间就会增加。
  80. // 这次实验的同一对象,所以这里的锁是起作用的。
  81. public synchronized void show(){
  82. for (int i = 0; i < 4; i++) {
  83. System.out.println(Thread.currentThread().getName() + " i=" + i);
  84. }
  85. }
  86.  
  87. }
  88.  
  89. /*
  90. * 改造一些 对象的生成,确保在Thread1 中获得的是同一对象
  91. */
  92. class Thread1 extends Thread{
  93.  
  94. private Ag mag;
  95.  
  96. public Thread1(Ag ag) {
  97. mag = ag;
  98. }
  99.  
  100. @Override
  101. public void run() {
  102. mag.show();
  103.  
  104. }
  105. }

验证代码快的方式?

  1. public class SynchrDemo {
  2. public static void main(String[] args) {
  3.  
  4. // 改造后,可以确保是同一对象 验证 synchronized 是否生效
  5. Ag ag = new Ag();
  6.  
  7. Thread1 thread1 = new Thread1(ag);
  8. Thread1 thread2 = new Thread1(ag);
  9.  
  10. thread1.start();
  11. thread2.start();
  12.  
  13. }
  14. }
  15.  
  16. class Ag{
  17. // 这次修饰的是方法,范围比代码块要大,意味着在这个区域内,锁生效的时候,都是在阻塞,其他线程的等待时间就会增加。
  18. // 这次实验的同一对象,所以这里的锁是起作用的。
  19. public void show(){
  20. synchronized (this) {
  21. for (int i = 0; i < 4; i++) {
  22. System.out.println(Thread.currentThread().getName() + " i=" + i);
  23. }
  24.  
  25. // this 就是当前的对象,我们现在获得就是同一对象
  26. System.out.println(this);
  27. }
  28. }
  29.  
  30. }
  31.  
  32. /*
  33. * 改造一些 对象的生成,确保在Thread1 中获得的是同一对象
  34. */
  35. class Thread1 extends Thread{
  36.  
  37. private Ag mag;
  38.  
  39. public Thread1(Ag ag) {
  40. mag = ag;
  41. }
  42.  
  43. @Override
  44. public void run() {
  45. mag.show();
  46.  
  47. }
  48. }

三   类锁?  非同一对象

  1. /*
  2. *
  3. * 类锁,全局锁如何实现?
  4. 全局锁: 锁住整个 Class,而非某个对象或实例
  5.  
  6. 实现:
  7. 1 在静态方法上用 synchronized 关键字修饰
  8. 2 在代码块上使用 类名.class
  9.  
  10. static 声明的方法为全局方法,与对象实例化无关,
  11. 所以 static synchronized 方法为全局同步方法,与对象实例化无关。
  12. */
  13.  
  14. public class SynchrDemo {
  15. public static void main(String[] args) {
  16.  
  17. //非同一对象
  18. Thread2 thread1 = new Thread2();
  19. Thread2 thread2 = new Thread2();
  20.  
  21. thread1.start();
  22. thread2.start();
  23.  
  24. }
  25. }
  26.  
  27. class Ag{
  28. public void show(){
  29. // 使用 synchronized() 方法,将锁控制在代码快上。
  30. synchronized (Ag.class) {
  31. for (int i = 0; i < 4; i++) {
  32. System.out.println(Thread.currentThread().getName() + " i=" + i);
  33. }
  34.  
  35. // this 就是当前的对象,我们现在获得就是非同一对象
  36. System.out.println(this);
  37. }
  38. }
  39.  
  40. }
  41.  
  42. class Thread2 extends Thread{
  43.  
  44. @Override
  45. public void run() {
  46. Ag ag = new Ag();
  47. ag.show();
  48.  
  49. }
  50. }

测试   关键字修饰 static 方法

  1. public class SynchrDemo {
  2. public static void main(String[] args) {
  3.  
  4. //非同一对象
  5. Thread2 thread1 = new Thread2();
  6. Thread2 thread2 = new Thread2();
  7.  
  8. thread1.start();
  9. thread2.start();
  10.  
  11. }
  12. }
  13.  
  14. class Ag{
  15. // 静态的方法 被synchronized 修饰后, 锁住的是 类。
  16. public static synchronized void show(){
  17. for (int i = 0; i < 4; i++) {
  18. System.out.println(Thread.currentThread().getName() + " i=" + i);
  19. }
  20. }
  21.  
  22. }
  23.  
  24. class Thread2 extends Thread{
  25.  
  26. @Override
  27. public void run() {
  28. Ag ag = new Ag();
  29. ag.show();
  30.  
  31. }
  32. }

Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?的更多相关文章

  1. 理解Java中对象基础Object类

    一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...

  2. Java锁Synchronized,对象锁和类锁举例

    Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须 ...

  3. Java锁Synchronized对象锁和类锁区别

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  4. Java对象锁和类锁全面解析(多线程synchronized关键字)

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  5. java的对象锁和类锁

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  6. 【Thread】java线程之对象锁、类锁、线程安全

    说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...

  7. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

  8. java 对象锁和类锁的区别(转)

    java 对象锁和类锁的区别   转自; ) ); ; ) ); 上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可 ...

  9. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

随机推荐

  1. 【LeetCode】371. Sum of Two Integers 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 位运算 日期 题目地址:https://leetco ...

  2. 【LeetCode】423. Reconstruct Original Digits from English 解题报告(Python)

    [LeetCode]423. Reconstruct Original Digits from English 解题报告(Python) 标签: LeetCode 题目地址:https://leetc ...

  3. 1340 - Story of Tomisu Ghost

    1340 - Story of Tomisu Ghost   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...

  4. Now冥想:崩溃服务和性能服务助力提升应用质量

    想就像心灵的"健身房",当遇到失眠或情绪问题时,我们可以通过冥想,抚平情绪波澜,享受放松时刻.<Now冥想>正是一款专注冥想与心理健康的应用.它基于国际先进的正念冥想理 ...

  5. CS5266参数|Capstone CS5266|CS5266应用方案

    随着目前手机.笔电和平板类产品都是用的Type-C接口,特别是苹果类的笔电和平板就只有一个Type-C接口,在很多工作.学习.娱乐中突显很多不方便的情况,别是需要一些其他的功能如:鼠标键盘接口USB2 ...

  6. 编写Java程序,使用JDialog构造登录窗体

    返回本章节 返回作业目录 需求说明: 实现思路: 定义用户信息实体类User. 创建LoginDemoStart主类,初始化UI. 从UI获取用户信息并保存到User实体. 实现代码:

  7. Ranger-Kylin插件安装

    Ranger-Kylin插件安装, 从Ranger1.1.0版本开始支持Ranger Kylin插件, 从Kylin2.3.0版本开始支持Ranger Kylin插件的权限控制. 1.获取安装包 sc ...

  8. 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通

    本文介绍从创建 net6.0 项目运行在 windows 开发环境的 docker 然后正式部署至 liunx 服务器. 1 windows10 安装 docker 下载docker-desktop ...

  9. SpringBoot 之 Dao层模拟数据库操作

    单表操作: # src/main/java/com/wu/dao/DepartmentDao .java @Repository public class DepartmentDao { privat ...

  10. 原型模式(python)

    原型模式也叫克隆模式,通过拷贝自身的属性来创建一个新的对象,基本方法就是调用copy模块下的 (浅拷贝)copy() 和(深拷贝)deepcopy() #!/usr/bin/env python3 # ...