`
Jonathan樊
  • 浏览: 77100 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Java的同步方法

阅读更多

同步方法锁的是对象

When one thread is executing a synchronized method for an object, all other threads that invoke synchronized methods for the same object block (suspend execution) until the first thread is done with the object.

当一个线程正在执行某个对象的同步方法的时候,其所有要执行这个对象的任意一个同步方法的其他线程都得等待,直到对象锁被释放。

 

在下面的例子中,只有线程1和线程3能够得到执行机会,因为线程2调用的也是一个同步方法value2(), 而线程1调用的value1()永远不返回(就不释放对象counter的锁).

 

public class Counter {
    private int counter;

    public synchronized void value1(){
     
       counter = 1;
       while(true){
   String threadName = Thread.currentThread().getName();
          System.out.println("我是一个线程,我的名字是 " + threadName + "我调用的是value1()");
   System.out.println("一旦我获得对象" + this + "的内部锁,其他线程都无法执行了");
   System.out.println("我只是想说明synchornized 方法锁的是对象,用的是对象的内部锁intrinsic locks");
       }
    }
  
    /**
    public void value3(){
     synchronized(this){
        counter = 1;
        while(true){
    String threadName = Thread.currentThread().getName();
           System.out.println("我是一个线程,我的名字是 " + threadName);
    System.out.println("一旦我获得对象" + this + "的内部锁,其他线程都无法执行了");
    System.out.println("我只是想说明synchornized 方法锁的是对象,用的是对象的内部锁intrinsic locks");
        }
     }
    }
    **/

    public synchronized void value2(){
       counter = 2;
       while(true){
   String threadName = Thread.currentThread().getName();
          System.out.println("我是一个线程,我的名字是 " + threadName + "我调用的是value2()");
   System.out.println("一旦我获得对象" + this + "的内部锁,其他线程都无法执行了");
   System.out.println("我只是想说明synchornized 方法锁的是对象,用的是对象的内部锁intrinsic locks");
       }
    }

    public void value(){
      while(true){
   String threadName = Thread.currentThread().getName();
   System.out.println("我是一个线程,我的名字是 " + threadName); 
   System.out.println("我调用的是对象" + this + "的不加synchronzied方法value(), 我不独占这个对象,其他线程可以调用,其实我人很好" ); 
      }
    }
    
    public static void main(String... args){
     Counter ctr = new Counter();
     
     new Thread1(ctr).start();
     new Thread2(ctr).start();
     new Thread3(ctr).start();

    }
    
    private static class Thread1 extends Thread{
     private Counter counter;
     public Thread1(Counter counter){
    this.counter = counter;
    this.setName(" 线程 1 ");
     }
     
     public void run(){
    counter.value1(); 
     }
   }

   private static class Thread2 extends Thread{
     private Counter counter;
     public Thread2(Counter counter){
    this.counter = counter;
    this.setName(" 线程 2 ");
     }

     public void run(){
    counter.value2(); 
     }

   }

   private static class Thread3 extends Thread{
     private Counter counter;
     
     public Thread3(Counter counter){
    this.counter = counter;
    this.setName(" 线程 3 ");
     }

     public void run(){
    counter.value(); 
     }
   }

}

分享到:
评论

相关推荐

    java 同步方法

    【Java 同步方法】是Java编程中...总之,理解和优化Java同步方法的使用,是提高多线程应用程序性能和可伸缩性的核心。通过精细调整同步策略,可以有效地减少争用,提升并发性能,从而让程序在高负载环境下表现更佳。

    Java异步调用转同步方法实例详解

    Java异步调用转同步方法实例详解 Java异步调用转同步方法实例详解是指在Java中将异步调用转换为同步调用的技术,主要用于解决异步调用过程中的阻塞问题。异步调用是一种非阻塞的调用方式,调用方在调用过程中,不...

    Java同步机制浅谈

    ### Java同步机制浅谈 #### synchronized关键字的作用及应用 在Java多线程环境中,`synchronized`关键字扮演着至关重要的角色。它可以帮助开发者确保多线程环境下的数据一致性,防止因并发访问导致的数据错误。本...

    java同步网络时间

    Java同步网络时间是一个常见的任务,尤其对于需要时间精确性的应用来说非常重要。这个任务可以通过Java的NTP(Network Time Protocol)库来实现。NTP是一种互联网协议,用于在计算机之间同步时间,确保网络上的设备...

    java多个数据库实现数据同步

    在Java中,实现多数据库同步的方法有很多,以下是一些常用的技术和策略: 1. **触发器和存储过程**:在每个数据库中设置触发器,当数据发生变化时,触发器会调用存储过程,将更改发送到其他数据库。然而,这种方法...

    java同步大杀器concurrent 包

    java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大杀器concurrent 包java同步大...

    Java文件同步开源项目Sync

    【Java文件同步开源项目Sync】是一个基于Java语言开发的实用工具,主要目的是提供高效、可靠的文件和目录同步功能。这个开源项目为开发者提供了一个简单易用的命令行接口,允许用户方便地对本地或远程文件系统进行...

    java使用datax增量同步代码

    Java 使用 DataX 进行增量同步是大数据领域中常见的数据迁移任务,DataX 是阿里开源的一个强大、高效的数据同步工具,它可以实现不同数据存储之间的数据迁移。本篇将详细讲解如何在 Java 项目中利用 DataX 实现增量...

    java 多线程同步方法的实例

    本文将深入探讨Java中的多线程同步方法,并通过实例来阐述其工作原理。 首先,我们要理解线程同步的基本概念。在多线程环境中,当多个线程试图访问同一资源时,如果没有适当的同步控制,可能会导致不可预测的结果。...

    java synchronize 线程同步

    如果多个线程尝试同时调用同一个对象的同步方法,那么只有一个线程能够获取到对象的锁并执行方法,其他线程则需要等待锁的释放。 在例子中,`execute()`方法没有被`synchronized`修饰时,两个线程并发调用同一个...

    java同步synchronized关键字用法示例

    Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...

    21.线程的同步机制-synchronized同步方法-锁自动释放.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    深入探索Java中的同步机制:同步代码块与同步方法详解

    同步代码块和同步方法是Java中确保线程安全的重要机制。它们各有优缺点,适用于不同的场景。在实际开发中,开发者应该根据具体需求选择合适的同步机制。通过合理使用同步代码块和同步方法,可以有效地控制线程对共享...

    java数据实时同步系统

    Java数据实时同步系统是一种用于在不同数据库之间进行实时数据交换的技术解决方案。这种系统的主要目标是确保数据的一致性和完整性,特别是在分布式环境中,当数据需要在远程数据库和本地数据库之间频繁流动时。以下...

    深入学习Java同步机制中的底层实现

    Java同步机制是多线程编程中确保数据一致性与正确性的关键。在Java中,主要有两种同步机制:内置的`synchronized`关键字以及基于`java.util.concurrent`包中的高级同步工具类。本文将深入探讨这些机制的底层实现,...

    java实现两个mysql同步主库的数据

    下面我们将深入探讨如何使用Java实现两个MySQL数据库之间的数据同步,以及涉及的相关知识点。 首先,我们需要理解MySQL的复制原理。MySQL的主从复制是基于日志的,主库上的所有更改都会被记录到二进制日志(binlog...

    java synchronized同步静态方法和同步非静态方法的异同

    这意味着,对于同一个类的不同实例,它们各自拥有的同步方法可以并行执行,但同一时间只有一个实例的同步方法能被执行。例如: ```java public class Test { public synchronized void method1() { // ... } } `...

    Java 线程同步调用

    在Java中,实现线程同步最常用的方法之一是通过同步方法。在上述代码示例中,`MyThread`类中的`Sell()`方法被声明为`synchronized`。这意味着该方法在执行时会自动锁定当前对象实例,即`this`关键字。当一个线程正在...

    java同步、异步相关知识点

    ### Java中的同步与异步知识点详解 在Java编程语言中,同步(Synchronization)与异步(Asynchronization)是两个非常重要的概念,它们对于多线程处理和并发控制有着不可替代的作用。本文将深入探讨这两个概念的...

    java中synchronized(同步代码块和同步方法)详解及区别

    本篇文章将详细介绍`synchronized`的两种形式:同步代码块和同步方法,并分析它们的区别。 1. **同步代码块 (Synchronized Block)** 同步代码块的语法结构如下: ```java synchronized (object) { // 需要同步...

Global site tag (gtag.js) - Google Analytics