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

线程同步(二)-Lock(转载)

 
阅读更多

之前谈到,java提供了synchronized进行线程同步处理,在JDK1.5后,便出现了Lock,两者的区别是:

 

主要相同点:

Lock能完成Synchronized所实现的所有功能。


主要不同点:

Lock有比Synchronized更精确的线程语义和更好的性能

Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。

 


 

例子: 

(一) synchronized的处理

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的方法是存在于堆中

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

(二) 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();
}
finally{
lock.unlock();
}
}
 

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

相当于

Public static synchronized void add(User u)

{

     user=u;

     Dao.save(user)

}

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

如果实例化不同的对象 那么synchronized就不会出现同步效果了。而Lock有比Synchronized更精确的线程语义和更好的性能

Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。

 


分享到:
评论

相关推荐

    vc++ multithread多线程教程---线程通信--利用事件对象,线程同步--使用信号量,线程同步--使用互斥量,线程同步--使用临界区

    然而,多线程编程也带来了数据同步和线程通信的问题,以防止数据冲突和竞态条件。本教程将深入探讨四种常见的线程同步机制:事件对象、信号量、互斥量以及临界区,帮助开发者理解和掌握如何在VC++中安全地实现多线程...

    线程同步方法--Metux 实例

    在IT行业中,线程同步是多线程编程中的一个核心概念,主要目的是解决并发执行时可能出现的数据竞争和死锁问题,以确保程序的正确性和高效性。本实例以Metux库为例,通过C++编程语言在Visual Studio 2003环境下进行...

    c# 线程同步: 详解lock,monitor,同步事件和等待句柄以及mutex

    C#提供了多种机制来实现线程同步,包括lock关键字、Monitor、同步事件和等待句柄以及Mutex类。这些机制的主要目标是避免竞态条件,保证并发执行的线程能够正确地访问和修改共享数据。 首先,我们来看lock关键字。...

    多线程编程之四——线程的同步-VC知识库文章[归纳].pdf

    多线程编程之四——线程的同步-VC知识库文章[归纳].pdf

    前端开源库-fd-lock

    fd-lock 库的核心功能是提供一种机制,使得当一个进程或线程正在处理特定文件时,其他试图访问该文件的进程会被阻塞,直到原始进程完成操作并释放锁。这种机制在需要并发控制的场景下非常有用,例如在写入日志、更新...

    多线程编程四-线程同步.pdf

    【多线程编程四-线程同步】 线程同步是多线程编程中不可或缺的概念,主要是为了解决多个线程并发执行时可能出现的数据竞争和资源冲突问题。在多线程环境中,当多个线程试图同时访问和修改共享资源时,如果没有适当...

    Python库 | django-db-lock-0.1.1.tar.gz

    6. **线程安全**:`django-db-lock`考虑到了多线程环境,确保在不同线程之间正确地同步锁状态。 ### 应用场景 `django-db-lock`适用于各种需要并发控制的场景,例如: - **资源预订**:在处理有限资源(如会议...

    多线程并发编程-同步与互斥-原⼦变量-并发和⽆锁 数据结构

    多线程并发编程-同步与互斥-原子变量-并发和无锁数据结构 多线程并发编程是提高认程序性能的核心技术,但它也增加了编程的复杂性。因此,系统理解和掌握多线程并发编程的技巧变得尤为重要。本章将从多线程编程的...

    线程同步-mutex方案-Peterson方案

    在操作系统中,线程同步是确保多个并发执行的线程在访问共享资源时能正确协调其操作的关键技术。本文将详细探讨线程同步中的两种经典解决方案:mutex方案和Peterson方案,以及它们在Java环境中的实现。 首先,我们...

    模拟jdbc多线程竞争资源---【Eclipse项目】

    理解Java的Thread类、Runnable接口以及同步机制(如synchronized关键字、Lock接口、Semaphore等)对于解决多线程问题至关重要。 3. 线程竞争资源: 当多个线程尝试同时修改同一资源时,就会发生资源竞争。在JDBC中...

    vc++中的线程锁(线程锁保持线程同步)

    在提供的文件列表中,如`RWLock.cpp`,可能涉及到了读写锁(Read-Write Lock),这是一种更为复杂的线程同步机制,允许多个线程同时进行读操作,但只允许一个线程进行写操作,从而提高了并发性能。 `Thread.cpp`和`...

    多线程编程指南--c版

    3. **线程同步**:线程同步是确保多个线程正确协调执行的关键。常见的同步机制包括互斥量(mutex)、条件变量、信号量和读写锁。例如,互斥量通过`pthread_mutex_lock`和`pthread_mutex_unlock`来实现临界区保护,...

    Java多线程编程总结

    Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 ...

    实验二:线程的同步

    ### 实验二:线程的同步 #### 一、实验目的与背景介绍 在现代操作系统中,线程作为进程中的可调度实体,在多任务处理、提高程序效率方面扮演着极其重要的角色。本实验旨在深入理解线程与进程的概念,并通过实践...

    多线程的线程同步,线程通讯,Lock锁

    多线程的线程同步,线程通讯,Lock锁

    15-linux线程专题讲座-王保明.rar

    在Linux操作系统中,线程是进程的一个执行单元,它共享同一进程的地址空间和其他资源,因此线程间的通信和同步非常高效。本专题讲座由专家王保明主讲,深入探讨了Linux线程的相关概念、创建与管理、同步机制以及在...

    Python语言基础:线程同步.pptx

    在Python中,我们通常使用`threading`模块来管理线程,并通过`Lock()`对象来实现线程同步。以下是关于线程同步和`Lock()`对象的详细解释: 1. **线程同步的必要性**: 当多个线程共享同一块内存(如变量A)时,...

    Java多线程同步.pdf

    "Java多线程同步.pdf" Java多线程同步是指在Java语言中,如何使用synchronized关键字和其他同步机制来确保多线程程序的正确执行。在Java语言中,synchronized关键字用于对方法或者代码块进行同步,但是仅仅使用...

Global site tag (gtag.js) - Google Analytics