`

对象锁和块锁

阅读更多

        昨天测试同事测出一BUG,经分析是并发的问题,于是速速的加synchronized(this)提交,如下所示:


        可测试发现,我的synchronized根本不起作用。经分析,这里没有生效的原因是:每次请求过来,我都往线程池中submit一个匿名的实例(即new Runnable(){...}每次都是新建实例),而synchronized(this)锁住的是对象,所以不起作用。

        于是,修改如下,即控制住了,synchronized(locks)锁住空字节数组静态对象,各线程之间锁的都是这个locks。


        当然,对于我们的项目,由于是多应用节点部署的,通过synchronized锁是控制不住的,最终还是需采用数据库表进行并发控制。

        思路:新建一张表,里面设置一个状态字段(如0表示没有线程执行,1表示有线程正在执行),在代码的开始的地方,先查询表的这个状态是否为0,如为0,则将状态改为1,这样其它线程进来查询就发现是1,则等待一段时间再查询,直到为0再执行;在功能代码结束的地方(最好是finally中),将状态修改为0。

        特别注意:在代码的开始的地方,先查询表的这个状态是否为0,如为0,则将状态改为1,这块的逻辑要放在事务中,且查询表的状态用for update,以防止其它线程查出不正常的状态。

 

对象锁、类锁详细分析见:http://bijian1013.iteye.com/blog/1836575

  • 大小: 10 KB
  • 大小: 13.6 KB
分享到:
评论

相关推荐

    Java对象锁和类锁全面解析(多线程synchronize

    首先,对象锁是针对对象级别的锁定,它保护的是实例方法或者一个特定的代码块。当一个线程进入一个由`synchronized`修饰的实例方法或代码块时,它会获取到该对象的锁,其他试图访问同一锁的线程将被阻塞,直到持有锁...

    java多线程的条件对象和锁对象demo

    本示例"java多线程的条件对象和锁对象demo"着重探讨了如何利用锁对象和条件对象来精细控制线程的执行流程。 首先,我们需要了解Java中的锁对象。Java提供了多种类型的锁,其中最基础的是`synchronized`关键字,它...

    synchronized枷锁实例

    一个线程可以同时持有类锁和对象锁,只要这些锁对应的资源不同。例如,一个线程可以调用类的静态同步方法,同时另一个线程调用同一个类的实例同步方法,这两个操作是可以并发进行的,因为它们锁定的对象不同。 在...

    详解java 对象锁与类锁

    这样的代码同样实现了对象锁,但只有代码块内的代码会受到保护。 二、类锁 类锁,顾名思义,是锁定整个类的。它涉及到类的静态成员或静态方法。当多个线程试图访问一个类的静态同步方法或同步代码块时,它们将...

    透彻理解Java中Synchronized(对象锁)和Static Synchronized(类锁)的区别

    Java 中 Synchronized(对象锁)和 Static Synchronized(类锁)的区别 Synchronized 和 Static Synchronized 是 Java 中两种同步机制,它们都用于解决多线程并发访问的安全问题。然而,它们之间存在着本质的区别。...

    Java并发篇乐观锁,悲观锁,自旋锁

    - **实现**:synchronized基于Monitor机制,通过JVM实现,锁状态有无锁、偏向锁、轻量级锁和重量级锁四种。 - **轻量级锁**:在没有多线程竞争时,减少传统重量级锁的开销,适应线程交替执行同步块的场景。如果...

    lock锁,lock锁和synchronized的对比

    lock锁,lock锁和synchronized的对比 # Lock锁 JDK5.0后Java提供了一种更加强大的线程同步机制。一种显式定义同步锁对象来实现锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问...

    GBase 8s 锁简介

    GBase 8s 锁机制采用全局管理的封锁机制,在共享内存中分配一块内存集中标记锁的使用情况,在每个锁结构中保存锁的拥有者、锁定的对象、锁的类型等。每个锁占用 128 Byte。 GBase 8s 中有多种锁类型,包括: 1. ...

    Java对象锁

    在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。  1.对象的锁  所有对象都自动含有单一的锁。  JVM负责跟踪对象被加锁的次数。...  2.1同步到单一对象锁  当使用同步块时,如果方法下的同步块

    java 偏向锁、轻量级锁及重量级锁synchronized原理.docx

    总的来说,Java的`synchronized`通过对象头的Mark Word和Monitor对象实现了线程安全的同步机制,同时引入了偏向锁、轻量级锁和自旋锁等优化手段,以平衡性能和线程安全性。理解这些锁的工作原理对于编写高性能的并发...

    偏向锁-轻量级锁-重量级锁

    本文将详细解析Java中的偏向锁、轻量级锁和重量级锁,这些都是JVM为了提高并发性能而实现的锁优化策略。 首先,我们从最简单的偏向锁开始。**偏向锁**的设计理念是假设大多数情况下,锁都不会被多个线程竞争。当一...

    Java的锁机制的学习和使用

    `synchronized`代码块还可以指定任意对象作为锁对象,这为锁提供了更大的灵活性。例如,可以通过传递不同的对象引用来实现更细粒度的锁定策略: ```java public void method() { Object lock = new Object(); ...

    java锁机制Synchronizedjava锁机制Synchronized

    同时,Synchronized 代码块也可以在一定时期内霸占某个对象的钥匙,避免其他线程访问该对象的上锁房间。 Synchronized 的使用原则 Synchronized 的使用原则是“随用随借,用完即还”。但是,在某些情况下,可能...

    synchronized锁原理分析(一、从Java对象头看synchronized锁的状态)

    首先,我们需要理解synchronized锁住的是对象,而不是代码块。例如,当我们使用`synchronized (o)`对一个对象o进行加锁时,实际上是对o这个对象本身进行锁定,而不是对包围的代码块。这个过程通过修改对象的内部状态...

    Synchronized_锁升级知识点总结

    在偏向锁状态下,当一个线程访问同步块时,会在对象头和栈帧中记录下偏向的线程ID。如果再次进入同步块时,检查到线程ID一致,则无需使用CAS操作(Compare-And-Swap,比较并交换)来加锁和解锁,省去了部分开销。...

    java锁机制详解.pdf

    它可以指定任意对象作为锁,这意味着不同的代码块可以使用不同的锁,从而实现并发控制。例如,可以使用类级别的对象(静态成员)作为锁,使得多个实例可以同时访问,但不同实例间的某些操作仍然是互斥的。 使用...

    oracle数据库锁表处理

    3. **模式对象锁**:作用于模式对象(如表、视图等)。 4. **数据块锁**:作用于数据块,比行级锁更粗粒度。 #### 三、查看锁表情况 1. **查询锁定的对象**: ```sql SELECT * FROM v$locked_object; ``` 2. *...

    java锁的释放与建立

    内置锁是通过`synchronized`关键字实现的,它隐含地在每个对象上都存在。当一个线程进入一个由`synchronized`修饰的方法或代码块时,会自动获取锁,退出时则自动释放。显式锁则是通过`java.util.concurrent.locks....

    从0开始开发 基础库(配置文件读写、日志、多线程、多进程、锁、对象引用计数、内存池、免锁消息队列、免锁数据缓冲区、进.zip

    本压缩包“从0开始开发 基础库”涵盖了多个重要的编程概念和技术,包括配置文件读写、日志记录、多线程与多进程操作、同步机制如锁、对象引用计数、内存池以及两种优化数据结构——免锁消息队列和免锁数据缓冲区。...

    Java中瘦锁的应用

    通过缩小锁的范围,即只锁定真正需要同步的代码块,可以减少不必要的锁争用和等待时间。这种技术在单线程环境中也能带来性能的提升,因为它减少了锁操作的开销。 在文档中提到的ThinLocks: Featherweight ...

Global site tag (gtag.js) - Google Analytics