`
raymond2006k
  • 浏览: 295586 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java同步锁一个技巧

阅读更多
Synchronized 同步
  Java5开始虽然引入了高效的 Concurrent 并发包,但同步 synchroize 在一些场合还是需要使用的。
比较典型和我们通常的做法是对某个类成员变量加同步锁,这个变量一般是存储关键数据的。

但许多开源框架中有下面的用法, 例如:
Cglib 中的 MethodProxy :
package net.sf.cglib.proxy;
public class MethodProxy {
    private Signature sig1;
    private Signature sig2;
   private final Object initLock = new Object();

  private void init()
   {
        if (fastClassInfo == null)
        {
            synchronized (initLock)
            {
                if (fastClassInfo == null)
                {
                    CreateInfo ci = createInfo;

                    FastClassInfo fci = new FastClassInfo();
                   .................
                    fastClassInfo = fci;
                }
            }
        }
    }


大家不用关心MethodProxy 是做什么的,只需关注 private final Object initLock = new Object();
其中,initLock 对象不用来存储数据,而仅仅用来做同步锁对象,这样可以较小锁的粒度,非常高效。
因此, synchronized(this), synchroniezd( 存储用成员变量) 都可以替换为这个模式。

JDK 源码中也有很多这样的模式的范例可以参考。

分享到:
评论
15 楼 zhaoyta 2010-02-01  
同步就是保护资源的一致
lz这样写是为了保护那些资源呢

你这么些的话只是保证这个块里的资源不能被写,这样你要却 保这个类的其他方法不能修改或读取

不是百分之百的
14 楼 neptune 2010-02-01  
这种双锁机制,早就有了。
13 楼 zli.ray 2010-01-31  
flying_all 写道
大家都在谈论同步。我想问一下,如果在程序中真的有两个地方用到同一个对象,但是还没有做同步会发生什么样的情况。例如说connection。

我的理解是,有状态的对象,在多线程应用时,必须注意同步的问题,否则,状态容易混乱。
12 楼 flying_all 2010-01-31  
大家都在谈论同步。我想问一下,如果在程序中真的有两个地方用到同一个对象,但是还没有做同步会发生什么样的情况。例如说connection。
11 楼 mwei 2010-01-31  
原来:private final Object initLock = new Object();
改成:private final byte[] lock = new byte[0];

practical java 有其说明
10 楼 melode11 2010-01-30  
Synchronized(this) 和 Synchronized(mutex)
真的有性能差别吗...楼主真的写代码测试过吗?
synchronized顶多就是可能与自己的一些同步方法互斥吧,也就是说 synchronized(this)块 和 同步方法之间可以保证线程安全 ,如果多个线程同时调用同步方法和执行 synchronized(this)块会牺牲掉一些性能 。
9 楼 超级潜水艇 2010-01-30  
Mybeautiful 写道
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )

锁定的不是这个类,是这个类当前的对象。

怪我说法不科学。。
静态方法上加synchronized 锁定该类。
实例方法上加synchronized 锁定该实例。
8 楼 vlinux 2010-01-30  
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢
7 楼 zli.ray 2010-01-30  
zli.ray 写道
raymond2006k 写道
zli.ray 写道
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?


不可以,针对对象实例,不能加 static。

也就是说,去掉static关键字就可以了,对吗?
lz能否解释一下为什么不能加static那?这点不是很理解。

sorry,明白了,加static就共享了。
糊涂了,-_-
6 楼 zli.ray 2010-01-30  
raymond2006k 写道
zli.ray 写道
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?


不可以,针对对象实例,不能加 static。

也就是说,去掉static关键字就可以了,对吗?
lz能否解释一下为什么不能加static那?这点不是很理解。
5 楼 raymond2006k 2010-01-30  
zli.ray 写道
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?


不可以,针对对象实例,不能加 static。
4 楼 raymond2006k 2010-01-30  
Mybeautiful 写道
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )

锁定的不是这个类,是这个类当前的对象。


说的没错,锁的是实例。
3 楼 zli.ray 2010-01-30  
lz的 lock对象,我用普通的
private static Object lock = new Object();

来代替可以吗?
2 楼 Mybeautiful 2010-01-30  
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )

锁定的不是这个类,是这个类当前的对象。
1 楼 超级潜水艇 2010-01-30  
用单独的锁对象是要比锁整个类性能要高出很多。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。
那么不相关业务的锁定都同时锁定该类的话,那么有可能有这样的情景,即两个业务互不相干的,但是却要相互同步(因为方法上都用了synchronized )

相关推荐

    支持10000同步锁,Spring Boot,Java

    文件名`java_demo_synchronized`可能包含的是关于Java同步锁的示例代码,可以从中学习如何在实际项目中应用同步锁策略。通过深入理解同步锁的工作原理和优化技巧,我们可以构建出高效、高并发的Spring Boot应用程序...

    Java同步机制浅谈

    ### Java同步机制浅谈 #### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本...

    提升Java的锁性能Java开发Java经验技巧共5页.p

    - **内置锁(Synchronized)**:Java中的内置锁是通过关键字`synchronized`实现的,它提供了对方法或代码块的互斥访问,确保同一时间只有一个线程执行。 - **显式锁(Lock)**:Java并发包`java.util.concurrent....

    Java Thread多线程全面解析

    - 同步阻塞:尝试获取synchronized同步锁失败,线程进入等待锁的状态。 - 其他阻塞:调用sleep()、join()或进行I/O操作时,线程暂时释放CPU资源。 5. 死亡状态(Dead):线程的run()方法执行完毕或因异常退出,...

    java的Lock锁原理详解.docx

    Java中的锁机制是多线程编程中至关重要的一个概念,用于协调多个线程对共享资源的访问。在Java中,有两种主要的锁机制:synchronized和Lock。它们都是用来实现线程同步,防止数据竞争,确保并发环境下的数据一致性。...

    JAVA程序设计技巧1001例

    书中实例涵盖同步、锁、线程池等技术,帮助开发者理解并发编程的核心概念。 6. **反射与动态代理**:反射允许在运行时检查类、接口和对象,动态代理则允许在运行时创建代理类,实现动态绑定。这些技术在插件系统、...

    JAVA 数据同步软件Sync源代码

    【JAVA 数据同步软件Sync源代码】是一个专为JAVA初学者设计的本地数据同步工具,它模仿了云盘同步的功能,但并不依赖网络环境,而是通过本地文件系统的操作实现数据的同步与备份。这个项目对于想要深入理解JAVA编程...

    java 公司 面试 技巧

    - 类加载是Java虚拟机的一个重要过程,负责将类的字节码加载到内存中。 - **面试技巧**:解释类加载的过程,包括双亲委派模型的工作原理及其优点。 4. **状态管理** - 状态管理涉及如何在不同的请求之间维护...

    java并非编程,合集(各种锁、并发集合、障碍器、线程同步).zip

    内置锁是通过synchronized关键字实现的,它可以确保同一时间只有一个线程访问特定的代码块。显式锁则是由java.util.concurrent.locks包中的Lock接口及其实现类提供,如ReentrantLock,它提供了更灵活的锁定策略,...

    同步注解实现demo

    总结来说,"同步注解实现demo"可能是关于如何在Java中使用同步注解确保多线程环境下的数据一致性的一个实例,特别是在与Redis交互时。理解并熟练掌握同步控制是开发高效、安全的并发应用程序的关键。

    Java线程同步例子.pdf

    根据提供的文件内容,我们可以看到一个典型的Java线程同步的例子,其中涉及到了生产者(Producer)和消费者(Consumer)模式,以及同步方法和同步代码块的使用。 知识点一:生产者消费者模式 生产者消费者模式是多...

    Java程序设计技巧1001例

    每个编号可能代表一个独立的Java编程技巧或问题解决方案,下面我们将对这些可能涵盖的Java程序设计技巧进行详细解读: 1. **100.001:异常处理** - Java中的异常处理是编程中不可或缺的一部分,它确保了程序的健壮...

    JAVA面试题和面试技巧集合

    以下是一些Java的关键知识点,结合“JAVA面试题和面试技巧集合”这一主题,我们将深入探讨。 1. **基础语法**:Java的基础包括数据类型(如整型、浮点型、字符型和布尔型)、变量、运算符、流程控制语句(如if-else...

    java例程100例

    在“java例程100例”中,我们聚焦于Java编程语言,这是一个对初学者极其宝贵的资源。Java是一种广泛使用的面向对象的编程语言,以其跨平台性、安全性及高效性能而闻名。以下是对每个标签及其相关的Java知识点的详细...

    Java常见面试题及解析电子书&Java;程序员面试技巧

    这份资源包含两部分:《Java程序员面试技巧》和《50个Java常见面试题及解析电子书》,旨在帮助Java开发者更好地准备面试,提升成功几率。 首先,让我们深入探讨《Java程序员面试技巧》。在Java面试中,除了技术知识...

    java多线程经典案例

    而线程通信可能体现在当一个线程完成转账后通知另一个线程继续执行的场景。线程阻塞则可能出现在账户余额不足,需要等待外部充值后再继续转账的情况。 通过分析并实践`threadTest`案例,我们可以深入理解Java多线程...

    java开发实战经典

    6. **多线程**:讲解线程的创建方式(Thread类和Runnable接口)、线程同步(synchronized关键字、wait/notify机制、Lock锁)以及并发工具类如Semaphore、CountDownLatch等。 7. **网络编程**:包括Socket编程,理解...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...

Global site tag (gtag.js) - Google Analytics