Java多线程之深入理解synchronize关键字

synchronize锁重入:

关键字synchronize拥有锁重入的功能,也就是在使用synchronize时,当一个线程的得到了一个对象的锁后,再次请求此对象是可以再次得到该对象的锁。 
当一个线程请求一个由其他线程持有的锁时,发出请求的线程就会被阻塞,然而,由于内置锁是可重入的,因此如果某个线程试图获得一个已经由她自己持有的锁,那么这个请求就会成功,“重入” 意味着获取锁的 操作的粒度是“线程”,而不是调用。

public class SyncDubbol {

    public synchronized void method1(){
        System.out.println("method1....");
        method2();
    }
    public synchronized void method2(){
        System.out.println("method2....");
        method3();
    }
    public synchronized void method3(){
        System.out.println("method3....");
    }

    public static void main(String[] args) {
        final SyncDubbol sd=new SyncDubbol();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sd.method1();
            }
        }).start();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

上面的代码虽然三个方法都是被synchronize修饰,但是在执行method1方法时已经得到对象的锁,所以在执行method2方法时无需等待,直接获得锁,因此这个方法的执行结果是

method1....
method2....
method3....
  • 1
  • 2
  • 3

如果内置锁不是可重入的,那么这段代码将发生死锁。

public class Widget{
    public synchronized void dosomething(){
        System.out.println("dosomthing");
    }
}
public class LoggingWidget extends Widget{
    public synchronized void dosomething(){
        System.out.println("calling dosomthing");
        super.dosomething();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

原文地址:https://www.cnblogs.com/PrestonL/p/9507938.html

时间: 2024-08-30 03:15:39

Java多线程之深入理解synchronize关键字的相关文章

Java 多线程(六) synchronized关键字详解

Java 多线程(六) synchronized关键字详解 多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchronized关键字修饰一个方法的时候,该方法叫做同步方法. 当synchronized方法执行完或发生异常时,会自动释放锁. 下面通过一个例子来对synchronized关键字的用法进行解析. 1.是否使用synchronized关键字的不同 例子

cpu个数、核数、线程数、Java多线程关系的理解+物理cpu数和cpu核数和逻辑cpu数和vcpu区别

1.cpu个数.核数.线程数.Java多线程关系的理解 URL地址:https://blog.csdn.net/helloworld0906/article/details/905471592.物理cpu数和cpu核数和逻辑cpu数和vcpu区别 URL地址:https://blog.csdn.net/budonglaoshi123/article/details/84325720 原文地址:https://www.cnblogs.com/curedfisher/p/12204102.html

java并发编程--深入理解volatile关键字

??volatile是一个在java并发编程中耳熟能详的关键字.即使从来没有使用过,你也偶尔会在技术书籍或博客中见到.对volatile关键字的解释常常被一笔带过:被修饰的变量具有可见性,但不能保证原子性.但是到底如何保证可见性,可见性是什么--诸如此类的问题在碰到这种凝练的解释时会产生一种知其然不知其所以然的困惑.那么我将尽力在这一篇文章中将volatile关键字的意义彻底击穿. 可见性 ??可见性,顾名思义,可见程度.假如你在被窝里打开了手电筒,只有你自己知道手电筒打开了,那么可见性就非常差

java之结合代码理解synchronized关键字

为了保证数据的一致性即实现线程的安全性,java虚拟机提供了同步和锁机制.synchronized关键字是最基本的互斥同步手段.除此之外,还可以使用java.util.concurrent包中的重入锁(ReentrantLock)来实现同步.相比synchronized,ReentrantLock增加了一些高级功能,主要有等待可中断.可实现公平锁.锁可以绑定多个条件等. 见SynchronizedDemo.java的源码理解synchronized /** * Synchronized理解: *

Java多线程(四)—— synchronized关键字续

1.synchronized原理 在java中,每一个对象有且仅有一个同步锁.这也意味着,同步锁是依赖于对象而存在.当我们调用某对象的synchronized方法时,就获取了该对象的同步锁.例如,synchronized(obj)就获取了“obj这个对象”的同步锁.不同线程对同步锁的访问是互斥的.也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问. 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”.假设,在某一时

java多线程编程之使用Synchronized关键字同步类方法

最简单的方法就是使用synchronized关键字来使run方法同步,看下面的代码,只要在void和public之间加上synchronized关键字 复制代码 代码如下: public synchronized void run(){     } 从 上面的代码可以看出,只要在void和public之间加上synchronized关键字,就可以使run方法同步,也就是说,对于同一个Java类的 对象实例,run方法同时只能被一个线程调用,并当前的run执行完后,才能被其他的线程调用.即使当前线

java多线程(五)synchronized关键字修饰代码块

转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47916703 在上一篇博客中我们介绍了synchronized关键字修饰方法的用法,我们接着介绍synchronized关键字.除了修饰方法之外,还可以修饰代码块,一共有以下5种用法. 一.this synchronized(this){ //互斥代码 } 这里的this指的是执行这段代码的对象,synchronized得到的锁就是this这个对象的锁,这种写法等价于我们上一篇博

java多线程(六)深入理解volitale关键字

转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47945849 我们继续来讨论java的多线程编程,今天我们一起来学习一下java多线程中的另一个关键字--volitale. 一.java内存模型与多线程编程中的三个感念 1.原子性 原子性是指一些操作或者全都执行,要么或者全都不执行,整个操作作为一个整体是不可分割的,例如,一个银行中有两个账户A,B,现在要从A账户中转账500元到B账户,那么一共可以分为两个步骤: 1.从A账户

Java 多线程 volitile 和 atomic

Java 多线程 volitile 和 atomic volitile关键字 public class MTester { public static class TestKey{ int x = 0; } public static TestKey key0 = new TestKey(); public static void main(String[] args) { Thread thread = new Thread(()->{ while (key0.x == 0){ } Syste