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

内置锁

 
阅读更多

Java 提供了一种内置锁机制来支持原子性:同步代码块。同步代码块包括两部分:一个作为锁的对象引用,一个作为由这个锁保护的代码块。以关键字synchronized来修饰的方法就是一种横跨整个方法体的同步代码块,其中 该同步代码块的锁就是方法调用所在的对象。静态的synchronized方法以Class对象作为锁。

 

synchronized(lock){
//访问或修改由锁保护的共享状态
}

 每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁(Intrisic Lock)或监视器锁(Monitor Lock)。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁,而无论是通过正常的控制路径退出,还是通过从代码块中抛出异常退出。获得内置锁的唯一途径就是进入由这个锁保护的同步代码块或方法。

 

 Java内置锁相当于一种互斥锁,这意味着最多只有一个线程能持有这种锁。当线程A尝试获取一个由线程B持有的锁时,线程A必须等待或者组赛,知道线程B释放这个锁。如果B永远不释放锁,A将永远地等下去,就构成死锁。

 由于每次只能有一个线程执行内置锁保护的代码块,因此,由这个锁保护的同步代码块会以原子方式执行,多个线程在执行该代码块时也不会相互干扰。并发环境中的原子性与事物应用程序中的原子性有着相同的含义----一组语句作为一个不可分割的单元被执行。任何一个执行同步代码块的线程,都不可能看到有其他线程正在执行由同一个锁保护的同步代码块。

 

public class SynchronizedFactorizer implements Servlet{
    private BigInteger lastNumber;
    private BigInteger[] lastFactors;

    public syncronized void service(ServletRequest req,ServletResponse resp){
        BigInteget i=extractFromRequest(req);
        if(i.equals(lastNumber))
             encodeIntoResponse(resp,lastFactors);
        else{
             BigInteger[] factors=factor(i);
             lastNum=i;
            lastFactors=factors;
            encodeIntoResponse(resp,factors);
 
         }
 
  }
}

 

   我们在上面程序中使用了关键字synchronized来修饰service方法,因此在同一时刻只有一个线程可以执行service方法。然而,这种方法 过于极端,因为多个客户端无法同时使用因数分解servlet,服务的响应性非常低,无法令人接受。这是一个性能问题,而不是线程安全问题。

 

分享到:
评论

相关推荐

    Java多线程之显示锁和内置锁总结详解

    主要分为两种类型:内置锁(也称为监视器锁)和显式锁。本文将深入探讨这两种锁的特性和使用场景。 内置锁是Java中通过`synchronized`关键字实现的。当一个线程进入`synchronized`修饰的方法或代码块时,它会自动...

    5-4JVM内置锁synchronized关键字详解.mp4

    5-4JVM内置锁synchronized关键字详解.mp4

    行业资料-交通装置-3T材料车内置锁环.exe

    行业资料-交通装置-3T材料车内置锁环.exe

    行业资料-交通装置-5T材料车内置锁环装置.zip

    行业资料-交通装置-5T材料车内置锁环装置.zip

    行业资料-交通装置-2T固定车厢式矿车内置锁环.zip

    行业资料-交通装置-2T固定车厢式矿车内置锁环.zip

    深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    深入理解Java内置锁(synchronized)和显式锁(ReentrantLock) Java中有两种锁机制:内置锁(synchronized)和显式锁(ReentrantLock)。内置锁是Java语言提供的一种同步机制,使用synchronized关键字声明的方法或...

    haifeng-wang#book-1#可重入内置锁1

    当计数值为0时,这个锁就被认为是没有被任何线程所持有,当线程请求一个未被持有的锁时,JVM将记下锁的持有者,并且将获取计数值置为1,如果同一个线程再次获取这个锁

    支持10000同步锁,Spring Boot,Java

    内置锁是通过synchronized关键字实现的,它提供了对方法或代码块的独占访问,当一个线程进入一个由synchronized修饰的方法或块时,其他试图进入的线程将被阻塞,直到当前线程完成执行并释放锁。 例如,我们可以使用...

    面向Java锁机制的字节码自动重构框架.zip

    在Java中,锁主要分为内置锁(也称为监视器锁)和显式锁。内置锁是通过synchronized关键字实现的,它提供了两种形式:同步方法和同步代码块。同步方法通过在方法声明前加上synchronized关键字来锁定整个方法的执行,...

    Java锁机制详解.pdf

    Java锁机制的发展历经了多个版本的改进,尤其是Java 5.0引入的显示锁(Explicit Locks),提供了一系列比内置锁(synchronized)更灵活的同步手段。 在Java中,内置锁是通过synchronized关键字实现的,而显示锁则是...

    java锁的释放与建立

    首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`synchronized`关键字实现的,它隐含地在每个对象上都存在。当一个线程进入一个由`synchronized`修饰的方法或代码块时,会自动...

    java中的锁

    在Java中,锁主要分为两种类型:内置锁(也称为同步锁)和显式锁。内置锁是通过synchronized关键字实现的,而显式锁则是通过java.util.concurrent.locks包中的Lock接口及其实现类来提供的。 一、内置锁...

    Java多线程高并发篇(一)--重入锁

    在Java多线程高并发编程中,重入锁(ReentrantLock)是一个至关重要的概念,它提供了比Java内置锁(synchronized)更细粒度的控制,并且具有更高的可读性和可扩展性。本篇文章将深入探讨重入锁的相关知识点。 首先...

    聊聊锁的那些事

    这些工具类提供了比内置锁更高级的功能,比如公平锁、条件变量、可中断锁等。其中,ReentrantLock是基于AbstractQueuedSynchronizer(AQS)实现的,AQS是一个用来构建锁和其他同步器的框架,它利用一个int成员变量...

    java多线程之并发锁

    synchronized 关键字是 Java 语言的内置锁机制,它可以用来同步整个方法或代码块。但是,synchronized 关键字有一些缺点,例如它不能中断锁的获取过程,不能在锁的获取过程中抛出异常等。 Lock 接口是 Java 5.0 中...

    java锁机制详解.pdf

    Java提供了多种锁机制,包括内置锁(也称为监视器锁)和显式锁。本文将详细解析Java锁机制及其应用。 1. **内置锁(监视器锁)**: - **synchronized关键字**:可以应用于方法或代码块。当一个方法被声明为...

    Java锁的知识总结及实例代码共7页.pdf.zip

    在Java中,锁主要分为两类:内置锁(也称为监视器锁)和显式锁。内置锁是通过synchronized关键字实现的,它可以保证线程的互斥和可见性。当一个线程进入某个对象的同步代码块或同步方法时,会自动获取该对象的锁,...

    Java并发锁简介-动力节点共9页.pdf.zip

    2. **可重入锁(ReentrantLock)**:这是Java并发包`java.util.concurrent.locks`中的一个锁,相比内置锁具有更高的灵活性。可重入锁支持公平锁和非公平锁模式,允许锁的持有者再次获取锁(即重入),并且可以实现锁...

    Java并发编程实践-07章-显示锁1

    它们为多线程环境提供了更高级别的控制和灵活性,弥补了内置锁(也称为监视器锁或内部锁)的不足。`ReentrantLock`是Java 5.0引入的,作为对`synchronized`关键字的一种扩展。 7.1. `Lock`和`ReentrantLock` `Lock`...

    并发编程过程中常用的原子锁和场景解答和模拟

    2. **可重入锁(ReentrantLock)**:是Java `java.util.concurrent.locks`包提供的锁,它具有与内置锁相似的功能,但提供了更高级的特性,如公平锁、非公平锁、尝试锁、定时锁和条件变量等。 3. **读写锁...

Global site tag (gtag.js) - Google Analytics