`
waterdh
  • 浏览: 96596 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

synchronized 和 lock

    博客分类:
  • Java
阅读更多

首先,先明确下synchronized的几个关键点:

A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

 

synchronized可以加在方法上,也可以加在对象上,通常理解为,只有持有了锁才可以进行对应代码块的执行。

 

java.util.concurrent.locks包下面提供了一些锁的实现,有读写锁,公平锁等。

 

将synchronized替换成lock的实现可以提升性能:

1. 大部分应用场景是读写互斥,写和写互斥,读和读不互斥。而synchronized则是都互斥。

    可以利用读写锁来优化性能,读锁锁住读的代码块,写锁锁住写的代码块。

2. 要确保你在理解原来利用到synchronized的代码逻辑,避免一概而论地把synchronized替换成锁。

 

比如:

public void getPair(){
          return "x="+x + ",y="+y;
}


//这个函数
public synchronized void  increment() {            
            x++;  
            y++;     
            getPair();
                             
 }  

//可以替换成
public void  increment() {
  lock.lock();
  try{
    x++;
    y++;
    getPair();
  }finally{
   lock.unlock();
}

//但是,如果getPair()是synchronized 
public synchronized void getPair(){
          return "x="+x + ",y="+y;
}
//还能替换这个函数吗?
public synchronized void  increment() {            
            x++;  
            y++;            
            getPair();                      
 }  
//这时候就不能简单地使用lock来替换了,这里要调用getPair();必需申请到对象锁,这个时候increment也要竞争这把锁
//因此这里的代码效果是读写互斥。
//如果只是用lock来锁住increment,则达不到效果。还得同时锁getPair();
//这里嵌套了synchronized,而synchronized的嵌套结构中在同一个对象的方法上是共享一把锁的。
//上面只是简单的例子,java编程思想的多线程编程中有更详细的这个例子,有兴趣的可以看看。

}
 

 

 

3
0
分享到:
评论
1 楼 a351780306 2017-06-23  
谢谢,终于看懂了,看了半天了,我可以这么理解么,lock锁里面如果出现synchronized锁,那他们不会互斥,执行lock的时候会继续执行synchronized,而如果synchronized嵌套synchronized,他们就是同一的一把锁,他们会互斥,执行第一个synchronized的时候,第二个synchronized会等第一个执行完得到锁才执行里面synchronized方法,

相关推荐

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

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

    java的lock和synchronized的区别.docx

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

    简单了解synchronized和lock的区别

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

    Synchronized 和 Lock 的区别和使用场景

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

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

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

    关于synchronized、Lock的深入理解

    1. **使用方式**:`synchronized`是隐式同步,无需手动释放,而`Lock`是显式同步,需手动调用`lock()`和`unlock()`。 2. **控制能力**:`Lock`提供了更多控制选项,如可中断、可选择公平性、锁分离等。 3. **异常...

    java的Lock锁原理详解.docx

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

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

    Synchronized和java.util.concurrent.locks.Lock都是Java中用于实现线程同步的关键字和接口,它们的主要目标是保证多线程环境下的数据一致性与并发安全。然而,两者在使用方式、控制粒度以及灵活性方面存在显著差异...

    并发synchronized详解.pdf

    为了解决这个问题,Java 提供了两种方式来实现同步互斥访问:synchronized 和 Lock。 synchronized 是一种内置锁,基于 JVM 内置锁实现,通过内部对象 Monitor(监视器锁)实现。Monitor 是一种对象锁,锁的是对象...

    Java 全栈知识点问题汇总(3).pdf

    总的来说,Java并发编程需要理解和掌握的关键点包括并发基础、线程同步机制(volatile、synchronized、Lock)、原籽性、可⻅性和有序性。开发者需要根据实际需求选择合适的同步策略,以保证程序在并发环境下的正确性...

    Synchronized与Lock

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

    lock锁,lock锁和synchronized的对比

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

    并发编程之synchronized&Lock&AQS详解(1)1

    在多线程编程中,确保线程安全是至关重要的,特别是在Java中,有两种主要的同步机制:`synchronized`和`Lock`。本文将详细解释这两种机制以及它们的基础概念。 首先,我们需要理解什么是同步和临界资源。同步是指在...

    java并发编程面试题

    synchronized 和 Lock 有什么区别? volatile 关键字的作用 # Lock体系 ## Lock简介与初识AQS ### Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势? ReentrantLock(重入锁)...

    并发编程 70 道面试题及答案.docx

    本文档总结了并发编程中的70道面试题及答案,涵盖了线程、synchronized、volatile、CAS、Lock、ReentrantLock等关键概念,旨在帮助开发者更好地理解并发编程的基本概念和机理。 线程间通信: * wait/notify机制:...

    线程 临界点.rar案例

    除了synchronized和Lock,Java还提供了一些其他的线程同步工具,如Semaphore(信号量)和CyclicBarrier(循环屏障),它们可以用来控制线程的并发数量或者协调多个线程的同步行为。 总之,理解并熟练掌握线程临界点...

    Thread基础知识点笔记总结

    Synchronized 和 Lock 的区别是:Synchronized 自己释放,ReentrantLock 需要手动释放;Synchronized 不可中断,除非抛出异常或者正常结束,ReentrantLock 可中断(设置超时时间方法)。 7. CountDownLatch ...

    java并发编程综合讲解

    此外,synchronized和Lock也可以确保可⻅性,因为它们保证了在释放锁之前会将修改的值刷新到主内存,从而保证其他线程读取到最新的值。 7. **有序性**: volatile保证了一定程度的有序性,避免指令重排序。...

Global site tag (gtag.js) - Google Analytics