`

synchronized 和 ReentrantLock

阅读更多
JDK5.0 开始,有两种机制来保护代码块不受并行访问的干扰.从旧版本的java用的synchronized 关键字达到这个目的,而JDK5.0引进勒ReentrantLock类。在测试线程的并行访问时,不同线程中调用的是同一个加锁对象所在类的实例。不同的实例,会得到不同的锁对象,最终结果是互不干扰。

Synchronized 关键字:
      java中两种使用synchronized的方式:同步代码块,同步方法.
      synchronized(obj)表示若多个线程同时访问时,只让其中一个线程最先取得obj对象对其加锁。其他线程则阻塞直到取得obj对象的线程执行代码块,此时被加锁的obj对象得到释放(解锁),其他线程得到通知取得该锁的obj对象。继续执行!
      很多情况可以使用synchronized(this){..}来同步代码块,但需要注意的是,使用this作为同步对象的话,如果同一个类中存在多个synchronized(this){..}代码块,其中任何一个synchronized(this)代码块处于被执行状态,则其他线程对其他synchronized(this){..}代码块的访问也会受到阻塞。
      需注意:同步代码块synchonized(this){}的多线程阻塞问题(包括synchronized同步方法),在并发处理的系统中(比如WEB服务器)会严重影响性能,建议慎重使用。可以使用sychronized(obj){..}缩小同步资源对象的范围来解决这个问题!


package com.mz.xx.tb;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SynchronizedTest{

    private Lock myLock = new ReentrantLock();
    
    /**
     * 第一种形式 同步方法
     */
    
//    synchronized public void synchronized_Test1(){
//        for(int i = 0;i<10;i++){
//            try {
//                Thread.sleep(2000);
//            } catch (InterruptedException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//            }
//        System.out.println("Synchronized way--"+Thread.currentThread().getName()+": "+i);
//        }
//    }
    
    /**
     * 第二种形式 同步代码块
     */

     public void synchronized_Test2(){
         synchronized (this) {
             for(int i = 0;i<10;i++){
                 try {
                     Thread.sleep(2000);
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
                 System.out.println("Synchronized way--"+Thread.currentThread().getName()+": "+i);
             }
        }
    }
    

     /**
     * 通过ReentrantLock同步代码块
     */
     public void reentrantLock_Test(){
         myLock.lock();//加锁
            try {
                for(int i = 0;i<10;i++){
                        Thread.sleep(2000);
                        System.out.println("ReentrantLock way--"+Thread.currentThread().getName()+": "+i);
                }
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally{
                myLock.unlock();//解锁
            }
    }
     
     
    public static void main(String[] args) {
        SynchronizedTest synchronizedTest = new SynchronizedTest();
//        String waysName = "Synchronized";
        String waysName = "ReentruntLockTest";
        Thread t1 = new Thread(new Demo(synchronizedTest,waysName));
        Thread t2 = new Thread(new Demo(synchronizedTest,waysName));
        t1.start();
        t2.start();
    }
    
}
class Demo implements Runnable{
    
    private SynchronizedTest synchronizedTest;
    private String waysName;
    
    public Demo(SynchronizedTest synchronizedTest,String waysName) {
        super();
        this.synchronizedTest = synchronizedTest;
        this.waysName = waysName;
    }


    public void run() {
        if(waysName.equals("Synchronized")){
//            synchronizedTest.synchronized_Test1();
            synchronizedTest.synchronized_Test2();
        }else if(waysName.equals("ReentruntLockTest")){
            synchronizedTest.reentrantLock_Test();
        }
    }
    
}


分享到:
评论

相关推荐

    第15讲 synchronized和ReentrantLock有什么区别呢?1

    在Java编程中,synchronized和ReentrantLock都是用于实现线程同步的重要工具,它们在并发控制方面扮演着关键角色。然而,两者之间存在一些显著的区别,这些差异体现在功能、灵活性、性能以及使用场景上。 首先,...

    简单聊聊Synchronized和ReentrantLock锁.docx

    本文将深入探讨Synchronized关键字锁和ReentrantLock锁的异同、功能特性以及它们在实际应用中的适用场景。 首先,Synchronized是一种内置的Java关键字,它提供了简单而强大的线程同步机制。当一个线程进入一个由...

    第15讲丨synchronized和ReentrantLock有什么区别呢?.html

    第15讲丨synchronized和ReentrantLock有什么区别呢?.html

    Lock、Synchoronized和ReentrantLock的使用

    Lock、Synchronized 和 ReentrantLock 的使用 Lock、Synchronized 和 ReentrantLock 是 Java 中三种常用的同步机制,每种机制都有其特点和使用场景。下面对这三种机制进行详细的分析和比较。 一、Synchronized ...

    ReentrantLock与synchronized

    在Java多线程编程中,`ReentrantLock`和`synchronized`都是用于实现线程同步的重要工具,确保在并发环境中数据的一致性和正确性。两者虽然都能实现互斥访问,但在功能、性能以及使用场景上有所不同。下面我们将深入...

    Java实习生面试复习(七):synchronized和ReentrantLock的学习

    Java并发编程中,`synchronized`关键字和`ReentrantLock`是两个重要的同步控制工具,它们主要用于保证多线程环境下的数据一致性与线程安全。本文将深入探讨这两个概念,了解它们的实现原理以及区别。 首先,`...

    22 到底哪把锁更适合你?—synchronized与ReentrantLock对比.pdf

    在Java中,有两种主要的锁机制:内置的`synchronized`关键字和显式的`ReentrantLock`类。这两者各有优劣,适用于不同的场景。下面我们将详细讨论它们的区别、性能、特性以及使用上的差异。 1. **功能对比**: - `...

    wangwang4git#just-do#简单说说Synchronized,ReentrantLock1

    背景,应该就是Synchronized的缺点Synchronized产生原因,原子性(Atomicity)与可见性(visibility),其中可见性涉及到JM

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

    本资源摘要信息中,我们将详细介绍并发编程相关的知识点,涵盖线程、synchronized、volatile、CAS、Lock、ReentrantLock 等概念,并对相关知识点进行了详细的解释和比较。 线程 在 Java 中,线程是并发编程的基础...

    Java并发编程相关技术使用案例

    1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...

    ReentrantLock与synchronized区别

    java语言 并发编程 ReentrantLock与synchronized区别 详解

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...

    演讲PPT-java并发程序设计

    在 java 中有多种同步机制,例如 synchronized 和 ReentrantLock。synchronized 是 Lock 的一种简化实现,而 ReentrantLock 提供了更多的功能。BlockingQueue 的实现也可以用来理解多线程的协调。 在使用 ...

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

    互斥同步,如synchronized和ReentrantLock,通过锁机制确保同一时刻只有一个线程访问资源,防止线程间的竞态条件。非阻塞同步,如基于CAS(Compare-and-Swap)操作的乐观锁,尝试进行操作并检测冲突,若无冲突则成功...

    多线程的使用与线程锁的两种实现

    本主题将深入探讨多线程的使用以及线程锁的两种主要实现方式: synchronized关键字和ReentrantLock。 一、多线程基础 1. 线程创建: - 继承Thread类:创建一个新的类,该类继承自Thread类,并重写run()方法。然后...

    笔记-4、显式锁和AQS1

    4. **可重入性**:synchronized和ReentrantLock(Lock的一个实现)都是可重入的,意味着一个线程在持有锁的情况下可以再次获取该锁,防止死锁的发生。 5. **公平性和非公平性**:ReentrantLock提供了公平锁和非公平...

    ReentrantLock 与 synchronized 简介

    ### ReentrantLock 与 synchronized 的比较 #### 一、引言 在Java中,多线程和并发控制一直是程序员关注的重点。随着Java的发展,其语言本身及标准库提供了丰富的工具来帮助开发者处理并发问题。其中,`...

    2023年Java面试题+详细总结.docx

    Lock 分为两种:Synchronized 和 ReentrantLock。Synchronized 是一种悲观锁机制,独占锁。ReentrantLock 是一种可重入锁机制,允许线程再次进入同步代码。 StringBuffer 和 StringBuilder StringBuffer 是 Java ...

    简单了解synchronized和lock的区别

    Java中的synchronized和ReentrantLock等独占锁就是悲观锁思想的实现,而java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。 线程阻塞的代价是很高的,因为线程状态的切换...

Global site tag (gtag.js) - Google Analytics