synchronized关键字有两种用法。第一种就是在《使用Synchronized关键字同步类方法》一文中所介绍的直接用在方法的定义中。另外一种就是synchronized块。我们不仅可以通过synchronized块来同步一个对象变量。也可以使用synchronized块来同步类中的静态方法和非静态方法。
synchronized块的语法如下:
public void method() { … … synchronized(表达式) { … … } } |
一、非静态类方法的同步
从《使用Synchronized关键字同步类方法》一文中我们知道使用synchronized关键字来定义方法就会锁定类中所有使用synchronzied关键字定义的静态方法或非静态方法,但这并不好理解。而如果使用synchronized块来达到同样的效果,就不难理解为什么会产生这种效果了。如果想使用synchronized块来锁定类中所有的同步非静态方法,需要使用this做为synchronized块的参数传入synchronized块国,代码如下:
通过synchronized块同步非静态方法
001 public class SyncBlock 002 { 003 public void method1() 004 { 005 synchronized(this) // 相当于对method1方法使用synchronized关键字 006 { 007 … … 008 } 009 } 010 public void method2() 011 { 012 synchronized(this) // 相当于对method2方法使用synchronized关键字 013 { 014 … … 015 } 016 } 017 public synchronized void method3() 018 { 019 … … 020 } 021 } |
在上面的代码中的method1和method2方法中使用了synchronized块。而第017行的method3方法仍然使用synchronized关键字来定义方法。在使用同一个SyncBlock类实例时,这三个方法只要有一个正在执行,其他两个方法就会因未获得同步锁而被阻塞。在使用synchronized块时要想达到和synchronized关键字同样的效果,必须将所有的代码都写在synchronized块中,否则,将无法使当前方法中的所有代码和其他的方法同步。
除了使用this做为synchronized块的参数外,还可以使用SyncBlock.this作为synchronized块的参数来达到同样的效果。
在内类(InnerClass)的方法中使用synchronized块来时,this只表示内类,和外类(OuterClass)没有关系。但内类的非静态方法可以和外类的非静态方法同步。如在内类InnerClass中加一个method4方法,并使method4方法和SyncBlock的三个方法同步,代码如下:
使内类的非静态方法和外类的非静态方法同步
public class SyncBlock { … … class InnerClass { public void method4() { synchronized(SyncBlock.this) { … … } } } … … } |
在上面SyncBlock类的新版本中,InnerClass类的method4方法和SyncBlock类的其他三个方法同步,因此,method1、method2、method3和method4四个方法在同一时间只能有一个方法执行。
Synchronized块不管是正常执行完,还是因为程序出错而异常退出synchronized块,当前的synchronized块所持有的同步锁都会自动释放。因此,在使用synchronized块时不必担心同步锁的释放问题。
分享到:
相关推荐
在Java中,`synchronized`有两种使用方式:同步方法和同步代码块。 1. 同步方法: 同步方法是指在方法声明前加上`synchronized`关键字,它会锁定该方法所在的对象。对于非静态方法,锁的是当前对象实例;对于静态...
本篇文章将深入探讨`synchronized`块同步方法及其应用,通过实例来阐述其工作原理。 首先,我们来看一个基本的例子。在上述代码中,`Example`类有一个`synchronized`修饰的`excute()`方法。这意味着当一个线程正在...
本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
- **synchronized代码块**:使用`synchronized(obj){...}`结构,其中obj是需要锁定的对象,这将同步代码块内的代码。 3. **示例分析** 在提供的示例中,我们有两个类`Account`和`Bank`,以及一个主类`Main8`。`...
- **代码块同步:** 也可以使用`synchronized`关键字来同步代码块,这样可以更细粒度地控制同步范围,提高程序性能。 ```java public void method() { synchronized (object) { // 代码块 } } ``` 这里的`object...
3. 在Servlet应用中,容器通常只会创建一个Servlet实例,因此所有用户请求都会共享同一个`synchronized`方法,从而保证了同步。 总的来说,`synchronized`关键字是Java多线程编程中实现同步的关键工具,它通过锁定...
六、synchronized 同步锁概念及使用方法 Synchronized 同步锁的作用是解决多线程访问实例变量时可能造成的数据脏读现象。Synchronized 的使用方法有四种: 1. synchronized 修饰普通方法 2. synchronized 修饰普通...
3. synchronized 块可以作为一种解决方法,来解决 synchronized 方法的缺陷。 synchronized 关键字是 Java 语言中解决线程同步机制的重要机制。它可以作用于对象、类和方法,实现多个线程的同步访问。然而,需要...
本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...
当我们说"使用`synchronized`块同步变量"时,意味着我们想要确保在同一时间只有一个线程能够访问特定的代码段,通常是方法或者一个对象的特定部分。 `synchronized`关键字有两种主要的使用方式:synchronized 方法...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在这个例子中,`increment()`和`decrement()`方法都用到了同步代码块,使得计数操作不会因线程并发而出现不正确的结果。 通过这两个示例,我们可以学习到同步代码块在实际编程中的应用,以及如何解决多线程环境下的...
在Objective-C中,当你使用`@synchronized`块包围一段代码时,会为指定的对象创建一个互斥锁。如果当前线程已经持有了该锁,那么它可以再次获取并执行内部的代码,而不会造成死锁。这种特性使得在嵌套使用`@...
在这个例子中,`synchronized`代码块锁定的是`lock`对象,这意味着即使有多个`ThreadTest`实例,只要它们使用的锁对象不同,也可以并发执行`run()`方法。 4. **线程同步的目的**: 线程同步的主要目的是保护共享...
- **同步方法**:在方法声明前加上`synchronized`关键字,使得整个方法成为同步方法。 ```java public synchronized void method() { // ... } ``` - **同步代码块**:指定一个对象作为锁,对特定的代码块...
2. **代码块同步**:锁定特定对象,只有获取到该对象锁的线程才能进入代码块。 ```java synchronized (object) { // 代码块 } ``` 这里的`object`通常是共享资源的实例引用。 二、`synchronized`的作用 1. **线程...
此外,synchronized块的使用也是同样的原理,如: ```java public class Test { public void method1() { synchronized (this) { // 代码块 } } } ``` 这里的`synchronized (this)`锁定的是当前实例对象,...
同步锁主要有两种形式:同步方法和同步代码块。 1. **同步方法**: 将`synchronized`关键字放在方法声明之前,可以将整个方法标记为同步的。这意味着同一时间只有一个线程能够执行该方法。在售票示例中,如果我们...