`
iwindyforest
  • 浏览: 230262 次
  • 性别: 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详细解读.docx

    synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...

    Java synchronized 详解.docx

    synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果 再细的分类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class ...

    关于线程同步

    总的说来,synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分 类,synchronized可作用于instance变量、object reference(对象引用)、static函数...

    Java同步机制浅谈

    总的说来,synchronized 关键字可以作为函数的修饰符,也可作为函数内的语句,也就 是平时说的同步方法和同步语句块。如果再细的分类,synchronized 可作用于instance 变量、 object reference(对象引用)、static ...

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

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

    Java中的同步与互斥机制–synchornized学习

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

    net学习笔记及其他代码应用

    24.在C#中,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。 答:string str = null 是不给他分配内存空间,而string str = \"\" 给它分配长度为空字符串的内存空间。 25.请详述在...

    java 面试题 总结

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 17、abstract class和interface有什么区别? 声明方法...

    JAVA面试题最全集

    再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 finalize?方法名。Java 技术允许使用 finalize() 方法在...

    【05-面向对象(下)】

    •局部内部类不能在外部类以外的地方使用,那么局部内部类也不能使用访问控制符和static修饰 匿名内部类 •匿名内部类适合创建那种只需要一次使用的类,定义匿名内部类的语法格式如下: •new 父类构造器...

    java面试宝典

    语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、...

    千方百计笔试题大全

    语句级触发和行级触发有何区别。 56 238、EJB容器提供的服务 56 239、EJB的角色和三个对象 56 240、EJB的几种类型 56 241、bean 实例的生命周期 56 242、激活机制 56 243、remote接口和home接口主要作用 56 244、...

    java面试800题

    答案是否定的,比如在这个列中使用‘%sdfd%’来进行模糊查询 Q0034 给定了一些创建数据库试图的SQL语句问什么条件下才可以对试图执行修改,增加,删除操作 特别强调了WITH CHECK OPTION这个约束的含义,使用,...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    Java常见面试题208道.docx

    118.在 hibernate 中使用 Integer 和 int 做映射有什么区别? 119.hibernate 是如何工作的? 120.get()和 load()的区别? 121.说一下 hibernate 的缓存机制? 122.hibernate 对象有哪些状态? 123.在 hibernate 中 ...

    java基础题 很全面

    2. 存储过程和函数的区别。 23 3. 事务是什么? 23 4. 游标的作用?如何知道游标已经到了最后? 23 5. 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别? 23 简答题 23 1. 作用域public...

    最新Java面试宝典pdf版

    5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 9 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9 7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最...

    Java面试宝典2020修订版V1.0.1.doc

    4、存储过程与函数的区别 41 5、索引的作用?和它的优点缺点是什么? 41 6、什么样的字段适合建索引 41 7、索引类型有哪些? 42 8、什么是事务?什么是锁? 42 9、什么叫视图?游标是什么? 43 10、视图的优缺点 43 ...

    Java面试宝典2010版

    5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 7、char型变量中能不能存贮一个中文汉字?为什么? 8、用最有效...

    Java面试笔试资料大全

    5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 9 6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 9 7、char型变量中能不能存贮一个中文汉字?为什么? 9 8、用最...

Global site tag (gtag.js) - Google Analytics