`

java synchronized与lock区别(转载)

    博客分类:
  • JAVA
阅读更多

 

synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列

如果实例化不同的对象 那么synchronized就不会出现同步效果了

1.对象的锁 
所有对象都自动含有单一的锁。 
JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。 
只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。 
每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。 
2.synchronized同步块 
2.1同步到单一对象锁 
当使用同步块时,如果方法下的同步块都同步到一个对象上的锁,则所有的任务(线程)只能互斥的进入这些同步块。 
Resource1.java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,虽然这些同步块处在不同的方法中,但由于是同步到同一个对象(当前对象 synchronized (this)),所以对它们的方法依然是互斥的。 
比如

Class Test {

    public static User user=null;

    Public synchronized void add(User u) {

       user=u;

       Dao.save(user)

    }

}

 

如果在线程1中 Test test=new Test();

User u=new User();

u.setUserName(“liaomin”);

u.setUserPassword(“liaomin”);

Test.add(u);

 

如果在线程2中 Test tes1t=new Test();

User u1=new User();

u1.setUserName(“huqun”);

u1.setUserPassword(“huqun”);

Tes1t.add(u1);

 

那么 现在线程1 和线程2同时启动 如果对象new的不是同一个Test

那么出现线程交叉的话 那么插入数据库中的数据就是相同的

因为你的user变量时静态的   你给他赋值第一次 假如还没有save的时候

另外一个线程改变了user的值 那么第一个线程插入时也就是第二次赋予的值了

 

所以要实现同步 那么可以改方法为静态的就能达到同步的效果了

修改如下

Public static synchronized void add(User u)

{

     user=u;

     Dao.save(user)

}

修改为static的方法是存在于堆中

是全局方法 针对于所有实例化与未 实例化的对象只存在一个 所以会出现同步队列

 

 

当然不用static 也可以 那就用lock

Class Test {

public static User user=null;

Lock lock=new ReentrantLock();

 

Public void add(User u) {

     lock.lock();

     user=u;

     Dao.save(user);

     lock.unlock();

}

}

这样无论你new多少个对象都会是线程同步的 相当于

 

Public static synchronized void add(User u) {

     user=u;

     Dao.save(user)

}

 

同时 lock性能上高于synchronized

只是lock需要手动关闭

 

ps:

主要相同点:lock能完成synchronized所实现的所有功能
主要不同点:lock有比synchronized更精确的线程语义和更好的性能.synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放.

 

分享到:
评论

相关推荐

    java的lock和synchronized的区别.docx

    Java 中的 Lock 和 Synchronized 的区别 Java 语言中有很多相似关键字或相似意义的字,但 lock 和 synchronized 是两个最容易混淆的关键字。它们都是锁的意思,都是为了线程安全性、应用合理性和运行效率的。下面...

    Java编程synchronized与lock的区别【推荐】

    Java 编程 synchronized 与 Lock 的区别 synchronized 和 Lock 是 Java 编程中两种常用的同步机制,用于实现线程安全的访问。两者都可以实现同步访问,但是它们有着不同的设计理念和使用场景。 synchronized 的...

    【Java面试题】lock与synchronized区别

    【Java面试题】lock与synchronized区别

    java中synchronized用法

    "Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...

    Java synchronized使用案例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...

    Java synchronized详细解读.docx

    Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...

    java synchronized demo

    在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本示例"java synchronized demo"旨在探讨`synchronized`关键字的用法及其作用机制。...

    java锁机制Synchronizedjava锁机制Synchronized

    "Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...

    Synchronized 和 Lock 的区别和使用场景

    本文将深入探讨两种主要的锁机制:`synchronized`关键字和`Lock`接口,以及它们各自的特点、应用场景和使用方式。 一、Synchronized `synchronized`是Java中的一个内置关键字,用于提供线程安全。它的主要作用是...

    简单了解synchronized和lock的区别

    了解synchronized和lock的区别 synchronized是Java语言中的一个关键字,用于线程同步,主要用于解决多线程之间的竞争问题。它可以将某个方法或代码块锁定,使得只有一个线程可以执行该方法或代码块,其他线程只能...

    java同步synchronized关键字用法示例

    volatile与synchronized的区别** `synchronized`提供了数据一致性,但会阻止线程并发执行,造成阻塞。而`volatile`关键字则可以保证变量的可见性,但不会提供互斥访问。因此,`volatile`通常用于读多写少的情况,...

    Synchronized与Lock

    "Synchronized与Lock"这个主题探讨了两种主要的同步机制:synchronized关键字和Lock接口(包括其实现类如ReentrantLock)。这两种机制都用于实现线程间的互斥访问,但它们在功能、灵活性和性能上有所差异。 首先,...

    synchronized和LOCK的实现原理深入JVM锁机制比较好.docx

    在 Java 中,锁机制是数据同步的关键,存在两种锁机制:synchronized 和 Lock。了解这两种锁机制的实现原理对于理解 Java 并发编程非常重要。 synchronized 锁机制是在软件层面实现的,它依赖 JVM 实现。 HotSpot ...

    java里面synchronized用法.doc

    Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...

    Java synchronized关键字和Lock接口实现原理

    Java synchronized关键字和Lock接口实现原理 Java 中的 synchronized 关键字和 Lock 接口是两种常用的线程同步机制,它们都可以用来解决并发问题。下面我们将详细介绍 synchronized 关键字和 Lock 接口的实现原理。...

    [JAVA][synchronized的使用]

    在Java编程语言中,`synchronized`关键字是一个至关重要的概念,它主要用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本篇文章将深入探讨`synchronized`的使用,包括其基本原理、使用方式以及实际应用...

    Java synchronized关键_动力节点Java学院整理

    在Java中,每个对象都有一个与之关联的锁,也称为同步锁,它允许线程在访问共享资源时进行互斥控制。 **synchronized原理:** 1. **对象锁**:每个Java对象都可以作为一个锁,当调用对象的`synchronized`方法或在...

    java的Lock锁原理详解.docx

    在Java中,有两种主要的锁机制:synchronized和Lock。它们都是用来实现线程同步,防止数据竞争,确保并发环境下的数据一致性。 首先,synchronized是Java的关键字,由JVM直接支持,其底层实现依赖于操作系统原语,...

    java synchronized详解

    9. **Lock接口与`synchronized`的区别** Java 5引入了`java.util.concurrent.locks.Lock`接口,提供了比`synchronized`更灵活的锁机制,如可中断的锁等待、尝试获取锁、可读写分离的锁等。 10. **性能考虑** `...

Global site tag (gtag.js) - Google Analytics