首页 > 其他分享 >学习笔记之synchronized

学习笔记之synchronized

时间:2023-09-13 23:33:38浏览次数:35  
标签:synchronized SynDemo ++ 笔记 学习 对象 public TestThread

学习笔记之synchronized

ynchronized是一个JDK提供的同步的关键字,通过synchronized可以锁定一个代码块或者一个方法,从而实现锁的效果。

synchronized的几种用法

1.修饰在对象方法上

public class SynDemo {
  int i = 0;
  int x = 0;
  public synchronized void testSync() {
    i++;
    x++;
  }
  }

放在方法上,锁的是SynDemo的实例对象。这里要弄清楚实例对象,简单的来说就是假如A和B是SynDemo的实例对象,那么A和B对不同的实例对象,所以A和B不形成互异关系。

2.在静态方法上:

public class SynDemo {
  static int value = 0;
  public synchronized static void testStaticSync() {
    value++;
  }
}

修饰在静态方法上的时候,锁的是这个类对应的类对象,也就是SyncDemo.class对象。再举个例子,假如A和B是SynDemo的实例对象,此时A和B形成互异关系。

3.在方法内部的同步代码快#

public class SynDemo {
  int i = 0;
  int x = 0;
  Object lockObj = new Object();
  public void testInnerSync() {
    synchronized(lockObj) {
      i++;
      x++;
    }
  }
}

使用synchronized关键字需要注意什么

其实synchronized是对一个对象上锁的,使用的时候需要注意在对同一个对象上锁才能达到互斥的目的。

(1)定义一个TestThread类,继承自Thread

(2)TestThread的内部持有一个SycDemo对象

(3)TestThread的run方法内部调用SyncDemo对象的testSync方法执行synchronized修饰的同步方法。

public class SynDemo {
    int i = 0;
    int x = 0;     // 争抢对象SyncDemo的锁
    public synchronized void  testSync() {
        i++;
        x++;
    }
 
    static class TestThread extends Thread {
        SynDemo lock;
        TestThread(SynDemo lock) {
            this.lock = lock;
        }
        @Override
        public void run() {
            lock.testSync();
        }
    }

    public static void main(String[] args) {          // 锁对象lock1
        SynDemo lock1 = new SynDemo();          // 锁对象lock2
        SynDemo lock2 = new SynDemo();
        
        TestThread threadA = new TestThread(lock1);
        TestThread threadB = new TestThread(lock2);
        
        threadA.start();
        threadB.start();
    }
}

像这种方式,threadAthreadB是达不到互斥的目的的,因为threadA锁住的是lock1对象;然而thread锁住的是lock2对象。完全争抢的不是同一个锁。

参考文章:https://mp.weixin.qq.com/s/nATPDj4jH2HWxKair28_SQ

标签:synchronized,SynDemo,++,笔记,学习,对象,public,TestThread
From: https://www.cnblogs.com/ahui-blog/p/17701090.html

相关文章

  • 学习笔记之Redis消息队列-基于Stream的消息队列
    学习笔记之Redis消息队列-基于Stream的消息队列Stream是Redis5.0引入的一种新数据类型,可以实现一个功能非常完善的消息队列。其实只需要知道写入消息队列的命令和读取消息队列的命令就行了写入消息队列:XADD读取消息队列的方式之一:XREAD在业务开发中,我们可以循环的调用......
  • 读书笔记-2023开发者报告-第一部分
    最近阅读了一年一度的开发者报告(来源csdn),这篇文章主要摘录一部分内容。这个开发者报告起始时间是2004年。从开发者职业上看,从事后端开发的比例最高。从开发者年龄上看,三十岁以下的开发者最多,达到了百分之七十多,但是比较之前,出现了一定下降。从开发工具选择上看,python上升程度很大,vu......
  • Python学习笔记-Python函数进阶
    函数多返回值思考如果一个函数有两个return,程序如何执行?例如:defreturn_num():return1return2result=return_num()print(result)上面代码只执行了第一个return,因为retrun可以退出当前函数,导致return下方的代码不执行。多个返回值如果一个函数要有多个返回值,书写方式示......
  • I2C虚拟项目学习记录
    DUT中中断信号的连接对应的参数定义parameterIC_INTR_NUM=12;parameterIC_RX_OVER_INTR_ID=0;parameterIC_RX_UNDER_INTR_ID=1;parameterIC_TX_OVER_INTR_ID=2;parameterIC_TX_ABRT_INTR_ID=3;parameterIC_RX_DONE_INTR_ID=4;parame......
  • 运算符初学习
    运算符(学习后慢慢补充)算数运算符:+,-,*,/,%(取余),--(?)赋值运算符:=关系运算符:>,<,>=,<=,==,!=,instanceof(?)用于判断是否相等,在if句型中会用到以下尚未了解逻辑运算符&&(与),||(或),!(非你即我)位运算符&,|,^,~,>>,<<,>>>条件运算符?:扩展赋值运算符+=,-=,*=,/=备注使用除号要......
  • 动手动脑9.11笔记整理2
    变量作用域的判定:  ......
  • PCIe 5.0 SSD明年底杀入笔记本!慧荣主控用上6nm先进工艺
    PCIe5.0SSD的严重发热问题大家应该都不陌生,有实验显示无风扇时连续写入55秒之后就会罢工,一个重要原因就是群联E26主控采用了相对落后的12nm工艺,功耗和发热无法控制。这就导致PCIe5.0SSD现在只能用在桌面平台,而且基本离不开风扇的辅助。近日,慧荣披露了他们的PCIe5.0SSD主控......
  • m基于深度学习网络的动物识别系统matlab仿真,带GUI界面
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要基于深度学习网络的动物识别系统是一种利用深度学习技术来进行动物识别和定位的系统。这种系统的工作原理是,通过使用深度神经网络对图像或视频进行分析,以识别出其中的动物并确定其位置。深度学习网络,特别是卷......
  • 生态保护红线划定与评估中气象因子计算方法 学习记录
    声明本文是学习GB-T42960-2023生态保护红线划定与评估中气象因子计算方法.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们1范围本文件规定了生态保护红线划定与评估中气象资料选取的要求,描述了气象因子计算的方法。本文件适用于生态功能的调查和生态保护......
  • FastAPI学习-12. 请求Cookie 参数
    前言你可以像定义 Query 参数和 Path 参数一样来定义 Cookie 参数。声明 Cookie 参数首先,导入 Cookie:fromfastapiimportCookie,FastAPI声明 Cookie 参数的结构与声明 Query 参数和 Path 参数时相同。第一个值是参数的默认值,同时也可以传递所有验证参数......