`
zhy20045923
  • 浏览: 156981 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

[转载]java.util.concurrent.locks Synchronized

    博客分类:
  • java
阅读更多
主要相同点:Lock能完成Synchronized所实现的所有功能。

主要不同点:Lock有比Synchronized更精确的县城予以和更好的性能。Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。

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需要手动关闭
分享到:
评论

相关推荐

    深入Synchronized和java.util.concurrent.locks.Lock的区别详解

    《深入Synchronized与java.util.concurrent.locks.Lock的区别详解》 Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与...

    基于线程池的Java多线程应用技术.pdf

    Java提供了两种方式实现线程同步机制,分别是使用synchronized关键字和java.util.concurrent.locks.Lock接口。 线程池的应用: 线程池技术可以应用于Web服务系统中,控制服务器系统的最大并发数与最多处理的任务数...

    工作在同一个java虚拟机中的线程能实现消息互发(alpha)

    6. **管程(Java 5后引入的`java.util.concurrent`包)**:如`java.util.concurrent.locks.Condition`和`java.util.concurrent.CountDownLatch`等,用于协调线程间的协作。 7. **ExecutorService和Future**:`java....

    整理的 神舟面试题 笔试题 有答案 要去神舟数码 软件公司面试的注意咯 再一版

    synchronized 是 Java 语言的一部分,用于实现同步块或同步方法,而 java.util.concurrent.locks.Lock 是 Java.util.concurrent 包中的一个接口,用于实现锁机制。 EJB 规范规定的禁止操作 EJB (Enterprise ...

    基于Java多线程同步的安全性研究.pdf

    "基于Java多线程同步的安全性研究" 本文主要研究了基于Java多线程同步的安全性问题,讨论了Java多线程同步机制的实现方法和安全性问题的解决方法。文章首先介绍了Java多线程同步的...10.Java.util.concurrent.locks包

    SimpleDateFormat线程不安全的5种解决方案.docx

    import java.util.concurrent.locks.ReentrantLock; public class SimpleDateFormatExample { private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss"); private static Lock lock = ...

    java多线程编程总结

    - `java.util.concurrent.locks.Lock`接口提供了比`synchronized`更灵活的锁定机制。 #### 六、Java多线程的高级特性 ##### 1. 线程池 - `java.util.concurrent.ExecutorService`接口提供了一种重用固定数量的线程...

    java Thread & synchronized & concurrent 线程、同步、并发

    为了解决这一问题,Java提供了更细粒度的锁,如`java.util.concurrent.locks.ReentrantLock`,它具有与`synchronized`相似的功能,但提供了更多的灵活性,如可中断的等待、定时等待和尝试获取锁。 此外,`java.util...

    java多线程实现生产者和消费者

    `java.util.concurrent.locks.Condition` 接口与 `java.util.concurrent.locks.Lock` 接口一起使用,提供了比`synchronized`更细粒度的控制。Lock提供了获取和释放锁的方法,而Condition则允许线程等待特定条件并被...

    J.U.C系列线程安全的理论讲解编程开发技术共6页.pdf

    3. **`java.util.concurrent.locks`包**:包含锁和条件变量的实现,如`ReentrantLock`、`ReadWriteLock`等,它们提供了比`synchronized`更灵活的锁机制。 4. **`java.util.concurrent.atomic`和`java.util....

    Java多线程 - (一) 最简单的线程安全问题

    3. **Lock接口**:Java提供`java.util.concurrent.locks.Lock`接口,提供了比`synchronized`更细粒度的锁控制,如可重入锁、公平锁等。例如,`ReentrantLock`。 ```java import java.util.concurrent.locks.Lock; ...

    多线程,高并发.pdf

    1. stop() 和 suspend() 方法为何不推荐使用? 2. sleep() 和 wait() 有什么区别? 3. 同步和异步有何异同,...5. 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同? 6. 概括的解释下线程的几种可用状态。

    [图文]Java标准类库-.doc

    `synchronized`关键字和`java.util.concurrent.locks`包中的锁机制是实现线程安全的关键。 6. **日期/时间API**:在Java 8之后,`java.time`包取代了传统的`java.util.Date`和`java.util.Calendar`,提供了更加友好...

    java的concurrent用法详解

    `java.util.concurrent.locks`包中提供了比`synchronized`关键字更强大、更灵活的锁实现——`ReentrantLock`。 **2.2.1 `ReentrantLock`特性** - 支持公平锁和非公平锁的选择。 - 提供尝试获取锁的能力,可以指定...

    concurrent-1.3.4-sources.jar

    4. **java.util.concurrent.locks** 包:这个包提供了高级锁机制,包括ReentrantLock、ReadWriteLock等。ReentrantLock可重入锁比内置的synchronized更灵活,提供了公平性和非公平性选择,以及尝试锁定、定时锁定...

    java5 thread

    Java5新增了三个多线程相关的包,分别是`java.util.concurrent`、`java.util.concurrent.atomic`和`java.util.concurrent.locks`。这些包提供了大量高级的并发控制工具和数据结构,使得开发者可以更加高效和安全地...

    JAVA Concurrent Programming

    4. `java.util.concurrent.locks`包 此包包含各种锁实现,如`ReentrantLock`(可重入锁)、`ReadWriteLock`(读写锁)和`Condition`(条件变量)。这些锁机制提供了更灵活的同步控制,比如读写锁允许多个读线程同时...

    实现Java高并发隔离 模拟

    3. **读写锁(ReentrantReadWriteLock)**:当读操作远多于写操作时,`java.util.concurrent.locks.ReentrantReadWriteLock`比`synchronized`更高效。读操作可并发执行,而写操作互斥。 4. **信号量(Semaphore)**...

    Java5.0多线程编程实践.pdf

    Java 5.0中`java.util.concurrent.locks`包提供了`ReentrantLock`类,它是一种可重入的互斥锁。与`synchronized`关键字相比,`ReentrantLock`提供了更多的功能,包括尝试非阻塞地获取锁、可中断地获取锁以及超时获取...

    javathread.part05.rar

    Java提供了`java.lang.Thread.dumpStack()`帮助诊断死锁,而`java.util.concurrent.locks`包中的`ReentrantLock`和`Condition`可以更精细地控制锁和条件,降低死锁的风险。 此外,`java.util.concurrent`包中的`...

Global site tag (gtag.js) - Google Analytics