synchronized锁机制 之 代码块锁

本文详细探讨了Java中的synchronized同步代码块,解释了如何通过代码块锁优化多线程同步,分析了synchronized块与同步方法之间的关系,并展示了如何使用任意对象作为同步监视器以提高效率。通过实例代码,阐述了不同锁对象如何影响线程执行的同步与异步行为。
摘要由CSDN通过智能技术生成

synchronized同步代码块

用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间。这种情况下可以尝试使用synchronized同步语句块来解决问题。看一下例子:

下面例子是优化后的例子 使用代码块锁,原先例子是方法锁,就是同步 必须要执行2个for

package org.java.base.sync;
public class ThreadDomain18
{
 public void doLongTimeTask() throws Exception
 {
 for (int i = 0; i < 100; i++)
 {
 System.out.println("nosynchronized threadName = " + 
 Thread.currentThread().getName() + ", i = " + (i + 1));
 }
 System.out.println();
 synchronized (this)
 {
 for (int i = 0; i < 100; i++)
 {
 System.out.println("synchronized threadName = " + 
 Thread.currentThread().getName() + ", i = " + (i + 1));
 }
 }
 }
}
package org.java.base.sync;
public class MyThread18 extends Thread
{
 private ThreadDomain18 td;
 
 public MyThread18(ThreadDomain18 td)
 {
 this.td = td;
 }
 
 public void run()
 {
 try
 {
 td.doLongTimeTask();
 } 
 catch (Exception e)
 {
 e.printStackTrace();
 }
 }
}
package org.java.base.sync;

public class Test1 {
 public static void main(String[] args)
 {
 ThreadDomain18 td = new ThreadDomain18();
 MyThread18 mt0 = new MyThread18(td);
 MyThread18 mt1 = new MyThread18(td);
 mt0.start();
 mt1.start();
 }
}

运行结果,分两部分来看:

synchronized threadName = Thread-1, i = 1
synchronized threadName = Thread-1, i = 2
nosynchronized threadName = Thread-0, i = 95
synchronized threadName = Thread-1, i = 3
nosynchronized threadName = Thread-0, i = 96
synchronized threadName = Thread-1, i = 4
nosynchronized threadName = Thread-0, i = 97
synchronized threadName = Thread-1, i = 5
nosynchronized threadName = Thread-0, i = 98
synchronized threadName = Thread-1, i = 6
nosynchronized threadName = Thread-0, i = 99
synchronized threadName = Thread-1, i = 7
nosynchronized threadName = Thread-0, i &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值