`
iwindyforest
  • 浏览: 235073 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Synchronized来修饰函数和Synchroinzed语句块在使用上的区别

阅读更多
在一个类中,两个不同函数使用

Synchronized来修饰函数f()

在函数g()中使用synchronized(syncObject)语句块

从输出中你能观察到两个方法同时运行,所以它们没有在对方的同步控制上阻塞.

package com.iwindyforest.syn;

/**
 * 把方法标记为synchronized : 一旦某个线程处于一个标记为synchronized的方法中,
 * 那么这个线程从该方法返回之前,其它要调用类中任何标记为synchronized的方法的线程都会被阻塞. 使用synchronized块 :
 * 这也被称为"同步控制块"(synchronized block),在进入此段代码前,
 * 必须得到syncObject对象的锁.如果其它线程已经得到这个锁,那么就得等到锁被释放以后,才能进入临界区.
 * 
 * @author chen.yinghua
 */
public class DualSyn
{
    private Object syncObject = new Object();

    public synchronized void f()
    {
        System.out.println("Inside f()");
        // Doesn't release lock
        try
        {
            Thread.sleep(1000);
        }
        catch(InterruptedException e)
        {
            throw new RuntimeException(e);
        }

        System.out.println("Leaving f()");
    }

    public void g()
    {
        synchronized(syncObject)
        {
            System.out.println("Insied g()");

            try
            {

                Thread.sleep(5000);
            }
            catch(InterruptedException e)
            {
                throw new RuntimeException(e);
            }

            System.out.println("Leaving g()");
        }
    }
}



package com.iwindyforest.syn;

/**
 * DualSync对象的f()方法在this上同步(通过在整个方法上同步),
 * g()的同步控制块在syncObject对象上同步.因此,两个同步控制相互独立. 在main()中通过创建调用f()的线程演示了这一点.
 * main()线程用来调用g(). 从输出中你能观察到两个方法同时运行,所以它们没有在对方的同步控制上阻塞.
 * 
 * @author chen.yinghua
 */
public class SyncObject
{
    public static void main(String[] args)
    {
        final DualSyn ds = new DualSyn();
        new Thread()
        {
            public void run()
            {
                ds.f();
            }
        }.start();

        ds.g();
    }
}
  • Syn.rar (3.5 KB)
  • 描述: Synchroinzed 源代码
  • 下载次数: 12
分享到:
评论
1 楼 zfyyfz 2008-08-06  
把方法标记为synchronized : 一旦某个线程处于一个标记为synchronized的方法中, 
* 那么这个线程从该方法返回之前,其它要调用类中任何标记为synchronized的方法的线程都会被阻塞.

非常好 !

相关推荐

    java中synchronized用法

    它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,synchronized 关键字可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类...

    java的线程同步机制synchronized关键字的理解_.docx

    synchronized 关键字可以作为函数的修饰符,也可以作为函数内的语句。它可以作用于 instance 变量、object reference(对象引用)、static 函数和 class literals(类名称字面常量)身上。 synchronized 关键字的...

    实例解析Java中的synchronized关键字与线程安全问题

    synchronized代码块,被修饰的代码成为同步语句块,其作用的范围是调用这个代码块的对象,我们在用synchronized关键字的时候,能缩小代码段的范围就尽量缩小,能在代码段上加同步就不要再整个方法上加同步。...

    java 函数 实用手册 源代码 计算机

    4. **异常处理**:Java使用try-catch-finally语句块来捕获和处理异常,手册会指导如何正确地使用异常处理机制,避免程序因错误而中断。 5. **集合框架**:包括List、Set、Map接口及其具体实现类,如ArrayList、...

    Java构造函数与普通函数用法详解

    3. 不能有任何非访问性质的修饰符修饰,例如static、final、synchronized、abstract都不能修饰构造函数。 4. 构造函数不能被直接调用,必须通过new关键字来调用。 四、构造函数的作用 构造函数的作用主要有两个: ...

    2021年JAVA面向对象程序设计练习题库B.doc

    在 Java 中,我们可以使用 try-catch 语句来捕获和处理异常。 Java 中的 finally 语句是指无论是否出现异常都会执行的语句。在 Java 中,我们可以使用 finally 语句来释放资源。 Java 中的 break 语句是指跳出...

    2023最新JAVA基础面试题.doc

    Java 中可以使用 synchronized 关键字来实现同步,也可以使用 Lock 接口和 Condition 接口来实现高级同步机制。 十一、反序列化 反序列化是指将二进制数据转换成 Java 对象的过程,通常用于网络通信、持久化和对象...

    Java经典教程

    13. 异常处理:理解异常的概念,掌握try-catch-finally语句块的使用,以及如何自定义异常。 六、函数式编程 14. Lambda表达式:Java 8引入了函数式编程概念,学习如何使用Lambda表达式简化代码。 15. 流(Stream):...

    Java programming specification.docx

    这适用于函数体开始、类和接口定义,以及if、for、do、while、switch、case语句,以及static、synchronized等修饰符。这样的对齐方式有助于快速识别代码块的边界。 3. **长语句换行**: 当一条语句、表达式或参数...

    JAVA期末考试卷及答案.doc

    1. 构造函数 default constructor:在JAVA中,如果一个类中未显式定义构造函数,那么系统将自动提供一个默认的无参构造函数,函数体为空。 2. 常量定义:在JAVA中,使用final关键字来定义一个常量,而不是const...

    java面试宝典.docx

    2. Java 没有 goto 语句,但可以使用 break 和 continue 语句来控制循环体的执行。 3. & 和 && 的区别在于,& 是位运算符,而 && 是逻辑与运算符。 4. 使用 break 语句可以跳出当前的多重嵌套循环。 5. switch 语句...

    北大java讲义

    15. **注解**:讲解注解的定义、使用和元注解,以及在编译、运行时注解的处理。 这份【北大Java讲义】对于初学者来说,不仅提供了理论知识,还可能包含了许多实践案例,帮助读者通过实际操作来加深理解。通过学习...

    Java面试问答题.pdf

    13. Java中的同步机制:Java提供了synchronized关键字来控制对方法或代码块的并发访问。 14. Java中的break和return语句:break用于跳出循环,return用于从方法返回值。 15. Java中的构造函数和方法覆盖:构造函数...

    java语言程序设计第二版 课件

    5. **面向对象编程**:理解类、对象、封装、继承和多态等核心概念,编写和使用构造函数,学习访问修饰符和包的概念,以及接口的应用。 6. **异常处理**:掌握Java异常处理机制,学习try-catch-finally语句块,理解...

    Java面试宝典2012最新版

    使用synchronized关键字修饰同步方法或代码块。 47. sleep()属于Thread类,暂停当前线程指定时间,但不释放对象锁;wait()属于Object类,会释放对象锁,等待其他线程调用同一对象的notify()或notifyAll()方法。 48. ...

    全新java初学者实践教程

    学习如何编写类,使用构造函数初始化对象,以及使用访问修饰符控制成员的访问权限。 4. **数组**:了解一维和多维数组的声明、初始化和操作,以及遍历数组的方法。 5. **字符串处理**:Java中的String类是不可变的...

    JAVA面试大全(适合应届生)

    2. 访问修饰符:public、private、protected和默认修饰符的使用和区别。 3. 继承:单继承与多层继承的特点,super关键字的应用。 4. 多态:抽象类、接口、重写(Override)和重载(Overload)的概念及其区别。 四、...

    java面试题.zip

    - 掌握try-catch-finally语句块的使用,以及如何抛出和捕获异常。 - 了解异常链和自定义异常的创建。 4. **集合框架** - 熟悉ArrayList、LinkedList、HashSet、HashMap等常用集合类的特点和使用场景。 - 了解...

    C#工程师面试题,基本语法、类、函数等运用

    - `finally`块确保在try-catch语句块中执行代码之后总是执行某些清理操作。 - `finalize`方法在Java中用于对象销毁前的资源清理,C#中使用`Dispose`模式代替。 ### 23. 垃圾回收机制 - C#使用自动垃圾回收机制来...

Global site tag (gtag.js) - Google Analytics