synchronized代码块中对象锁

关于synchronized中对象锁的介绍

根据获取的锁分类
1、获取对象锁
synchronized(this|object) {}
修饰非静态方法
在 Java 中,每个对象都会有一个 monitor 对象,这个对象其实就是 Java 对象的锁,通常会被称为“内置锁”或“对象锁”。类的对象可以有多个,所以每个对象有其独立的对象锁,互不干扰。
2、获取类锁
synchronized(类.class) {}
修饰静态方法
在 Java 中,针对每个类也有一个锁,可以称为“类锁”,类锁实际上是通过对象锁实现的,即类的 Class 对象锁。每个类只有一个 Class 对象,所以每个类只有一个类锁。

在 Java 中,每个对象都会有一个 monitor 对象,监视器。
1)某一线程占有这个对象的时候,先monitor 的计数器是不是0,如果是0还没有线程占有,这个时候线程占有这个对象,并且对这个对象的monitor+1;如果不为0,表示这个线程已经被其他线程占有,这个线程等待(锁的可见性)。当线程释放占有权的时候,monitor-1;
2)同一线程可以对同一对象进行多次加锁,+1,+1,重入性

例子:
创建三个线程,分别输出50次不同的数据

 new Thread() {
       String str1="222";
       @Override
       public void run() {
           super.run();
          synchronized (str1) {
               for (int i=0; i<50;i++) {
                   System.out.println("1");
               }
           }
       }
  }.start();
  new Thread() {
       String str1="222";
       @Override
       public void run() {
           super.run();
          synchronized (str1) {
               for (int i=0; i<50;i++) {
                   System.out.println("2");
               }
           }
       }
  }.start();
  new Thread() {
       String str1="222";
       @Override
       public void run() {
           super.run();
          synchronized (str1) {
               for (int i=0; i<50;i++) {
                   System.out.println("3");
               }
           }
       }
  }.start();

假如传入锁为字符串且都分别为“111”,“222”,“333”则交替输出1,2,3 也就是说锁不同,就不存在唯一性,可以同时被三个线程运行;
假如传入锁为字符串且都是“222”,则控制台先输出50个1,再输出50个2,再输出50个3,锁具有唯一性,即锁只能被一个线程占有,即锁具有互斥性(除了当前运行的线程,其他线程不可以执行当前锁的其他代码);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
synchronized代码块是一种在Java用于实现线程同步的机制。使用synchronized关键字修饰的代码块,可以保证同一时刻只有一个线程可以进入该代码块执行。 代码块使用的是对象的方式,也就是说,的范围是一个特定的对象。通常情况下,我们使用this关键字作为对象,也就是定当前对象。当一个线程进入同步代码块时,它会持有该对象,其他线程需要等待该线程释放后才能进入代码块执行。 另外,synchronized还可以非this对象。这种方式可以提高多线程并发执行的效率。例如,如果一个类有多个synchronized方法,使用非this对象作为可以使得这些方法在执行时不互相阻塞,从而提高效率。 总结来说,synchronized代码块是一种用于实现线程同步的机制,可以确保同一时刻只有一个线程进入代码块执行。可以使用this关键字定当前对象,也可以使用非this对象作为来提高并发执行效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [synchronized(方法, 代码)](https://blog.csdn.net/luciferlongxu/article/details/124809818)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [synchronized机制 之 代码](https://blog.csdn.net/qq_16504067/article/details/117695564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值