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

Java牛角尖【009】: 多线程中synchronized的锁定方式

阅读更多

同一个对象中的一个synchronized方法如果已有一个线程进入,则其它的线程必须等该线程结束后才能进入该方法。那么,如果一个类中有多个synchronized方法,会有什么情况呢? 
  看下面一段代码: 

Java代码 
  1. 1.  public class Test {    
  2. 2.      static Test t = new Test();    
  3. 3.      static Test2 t2 = new Test2();    
  4. 4.      
  5. 5.      public static void main(String[] args) {    
  6. 6.          // TODO Auto-generated method stub    
  7. 7.      
  8. 8.          TestThread tt = t.new TestThread();    
  9. 9.          tt.start();    
  10. 10.         try {    
  11. 11.             Thread.sleep(1000);    
  12. 12.         } catch (InterruptedException e) {    
  13. 13.             // TODO Auto-generated catch block    
  14. 14.             e.printStackTrace();    
  15. 15.         }    
  16. 16.         t2.test1();    
  17. 17.     }    
  18. 18.     
  19. 19.     class TestThread extends Thread {    
  20. 20.         @Override    
  21. 21.         public void run() {    
  22. 22.             // TODO Auto-generated method stub    
  23. 23.             t2.test2();    
  24. 24.         }    
  25. 25.     }    
  26. 26. }    
  27. 27.     
  28. 28class Test2 {    
  29. 29.     public synchronized void test1() {    
  30. 30.         System.out.println("test1 called");    
  31. 31.     }    
  32. 32.     
  33. 33.     public synchronized void test2() {    
  34. 34.         System.out.println("test2 called");    
  35. 35.         try {    
  36. 36.             Thread.sleep(3000);    
  37. 37.         } catch (InterruptedException e) {    
  38. 38.             // TODO Auto-generated catch block    
  39. 39.             e.printStackTrace();    
  40. 40.         }    
  41. 41.         System.out.println("test2 exit");    
  42. 42.     }    
  43. 43. }    

  运行结果如下: 
Java代码 
  1. 1.  test2 called    
  2. 2.  test2 exit    
  3. 3.  test1 called   

  很明显,当对象t2的synchronized方法test2被线程tt调用时,主线程也无法进入其test1方法,直到线程tt对test2方法的调用结束,主线程才能进入test1方法。 
  结论,对于synchronized方法,Java采用的是对象锁定的方式,当任何一个synchronized方法被访问的时候,该对象中的其它synchronized方法将全部不能被访问。 

分享到:
评论

相关推荐

    java多线程中synchronized关键字的用法

    java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com

    JAVA单线程多线程

    通过以上分析,我们可以看到,在Java中合理利用单线程或多线程以及`synchronized`关键字能够有效地提高程序的性能和响应能力,同时也需要注意其可能带来的复杂性和资源消耗问题。开发者应根据具体的应用场景和需求来...

    java 多线程synchronized互斥锁demo

    "synchronized"关键字就是Java中实现线程同步的关键工具,它用于控制对共享资源的访问,防止出现数据不一致的情况。 标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`...

    javad多线程

    Java 多线程编程是指在一个程序中可以运行多个线程,以提高程序的执行效率和响应速度。在 Java 中,多线程编程可以通过 Thread 类和 Runnable 接口来实现。 为什么需要多线程? 在单线程程序中,如果某个任务需要...

    java多线程Demo

    在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新的类,让它继承Thread类时,可以通过重写`run()`方法来定义线程执行的任务。然后创建该类的对象,并...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    - **线程的创建**:Java提供了两种创建线程的方式,一是通过实现`Runnable`接口,二是继承`Thread`类。每种方式都有其适用场景,需要根据实际需求选择。 - **生命周期**:线程有新建、就绪、运行、阻塞和终止五种...

    java多线程经典案例

    在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键知识点,包括线程同步、线程通信和线程阻塞。 线程同步是为了防止多个线程同时访问共享资源,导致...

    java多线程的讲解和实战

    - 同步机制:为了防止多个线程访问同一资源时产生数据不一致的问题,Java提供了`synchronized`关键字,可以锁定代码块或整个方法,确保同一时刻只有一个线程执行。 - 等待/通知机制:`wait()`, `notify()`, `...

    Java中的synchronized:同步方法与线程安全.md

    Java中的synchronized:同步方法与线程安全

    java多线程文件传输

    在Java中,多线程可以提高程序的执行效率,尤其在处理并发任务时,如大文件的上传、下载和传输。下面将详细探讨相关知识点。 1. **线程基础** - **线程定义**:线程是操作系统分配CPU时间的基本单位,是程序执行的...

    java中synchronized用法

    Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,synchronized 关键字可以作用于 instance 变量...

    基于Java synchronized同步锁实现线程交互.pdf

    "基于Java synchronized同步锁实现线程交互" Java多线程能够提高CPU利用...因此,在使用Java多线程的场景中,请充分理解Java线程各状态之间的关系及其切换,并使用synchronized、wait()和notify()方法实现线程交互。

    Java技巧:多线程程序设计二十三个要点

    Java的多线程程序设计是开发高效并发应用的关键技术之一,以下是对标题和描述中所述的二十三个要点的详细解释: 1. **主内存与工作内存**:Java的内存模型JMM(Java Memory Model)定义了主内存(Main Memory)和...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    在Java中,多线程设计模式的应用能够提升系统的性能、可扩展性和可维护性。 一、线程基础 在Java中,线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。Java提供两种...

    Java多线程编程核心技术_完整版_java_

    在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将深入探讨这一主题。 一、线程的创建与启动 1. 继承Thread类:创建一个新的类,该类继承自Thread类,然后重写...

    java多线程进度条

    为了在多线程中同步进度更新,我们可以利用synchronized关键字、wait()、notify()方法,或者使用Java并发库中的高级工具,如Semaphore、CyclicBarrier或CountDownLatch等。 一个简单的进度条实现可以采用共享变量...

    Java多线程结构_Java多线程结构_

    在Java中,实现多线程主要有两种方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当自定义类继承Thread类时,你需要重写它的`run()`方法。创建线程实例后,调用`start()`方法启动线程。`start()`会调用...

    Java多线程(Synchronized+Volatile+JUC 并发工具原理+线程状态+CAS+线程池)

    Java 多线程机制提供了两种实现同步的方式:Synchronized 和 Volatile。 1. Synchronized Synchronized 是 Java 语言中的一个关键字,用于实现线程同步。它可以保证在同一个时刻,只有一个线程可以执行某个方法...

Global site tag (gtag.js) - Google Analytics