早在总结一时,我就尽量的把synchronized的重点说的简单:它就是配和对象的隐式锁使用的,注意一定是对象的隐式锁!那么下面的 这个例子又怎么解释呢?
package thread;
public class ImplicitLockSample {
public static void main(String[] args) {
final ImplicitLock sample = new ImplicitLock();
new Thread(new Runnable() {
public void run() {
// ImplicitLock.method1();
sample.method1();
}
}).start();
new Thread(new Runnable() {
public void run() {
sample.method2();
}
}).start();
}
}
class ImplicitLock {
public static synchronized void method1() {
System.out.println("method1 executing...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void method2() {
System.out.println("method2 executing...");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这里ImplicitLock有两个同步方法,一个是static的,一个是普通的。ImplicitLockSample是一个测试主程序,实例化一个 ImplicitLock对象,并且开启两个线程,每个线程分别调用对象的method1和method2方法。每个进入方法的线程都会强制休眠 3秒。那么执 行的现象是什么呢?
要知道答案有以下几点要清楚:a.Class和Object的关系,b.static方法的含义,c.synchronized的机制,d.sleep的作用。清楚的知道 这些之后,一眼就能辨别method1和method2方法上的synchronized配和的是两把不同的对象隐式锁。答案也就清晰的知道这两个线程执行的 打印语句根本就不会相差近3秒的等待,而是几乎同时。下面我试着解释一下。
Class是Object的子类,说明了Class是特殊的对象,它自然也有对象隐式锁。static声明方法意味着这个方法不依赖于类的实例,而是 可以理解成去掉了隐式参数this的,类对象的方法。synchronized是与对象隐式锁绑定的,这代表了将其置于方法声明上它将与方法的持有 对象绑定。所以method1的同步锁是ImplicitLock类对象的隐式锁,而method2的同步锁是ImplicitLock实例对象的隐式锁。 sleep虽然能让 当前的线程休眠,但是它不会释放持有的隐式锁。这样主程序执行是虽然用同一个实例让两个线程分别去调用两个方法,但是它们之间并没 有任何竞争锁的关系,所以几乎同时打印,不会有近3秒的间隔。把method1的调用改成已注释的代码将更容易理解。如果method1的 synchronized去掉,或者method2加上synchronized的声明,那么它们将竞争同一个隐式锁。先获得锁的线程将在3秒后交出锁,后面的线程 才能执行打印。
写这篇补遗源自于对懒汉式单例的重新理解,之前对synchronized的机制不明了时,只知道使用synchronized关键字在static方法上声 明就能保证单例的线程安全,但是确不知道那算是误打误撞的理解。构造这个验证例子之前,static和synchronized的共同使用让我对 synchronized隐式锁有了更清晰的认识。所以打算再写写来分享这段体会。
ref:http://www.bianceng.cn/Programming/Java/201206/34152.htm
分享到:
相关推荐
总之,掌握Java多线程的生命周期、创建、启动、同步以及线程池的使用是编写高效、稳定并发程序的基础。理解这些知识点对于解决并发编程中的问题,比如资源竞争、死锁、线程安全性等问题,至关重要。在实际开发中,...
### Java多线程编程大总结 #### 一、Java多线程编程的演进与重要性 Java多线程编程自Java 5之后经历了显著的革新与扩展,引入了强大的并发包,极大地增强了多线程编程的能力。在Java 5之前,多线程的支持较为薄弱...
### Java多线程编程总结 #### 一、Java线程:概念与原理 1. **操作系统中线程和进程的概念** - 当前的操作系统通常为多任务操作系统,多线程是实现多任务的一种手段。 - **进程**:指内存中运行的应用程序,每个...
2. **JAVA多线程API**:论文会详细阐述JAVA提供的多线程API,如Thread类、Runnable接口、ExecutorService和Future接口等。通过实例解析这些类和接口的使用方法,帮助读者理解如何在实际编程中创建和管理线程。 3. *...
标题中的"java 多线程synchronized互斥锁demo"指的是一个示例,展示了如何在多线程环境下使用`synchronized`关键字创建互斥锁,确保同一时间只有一个线程可以访问特定的代码块或方法。 描述中的"一个多线程访问的同...
以上内容涵盖了Java多线程的基础知识,包括创建、同步、终止、线程安全和并发控制等方面。通过实际的代码实践,可以深入理解并掌握这些概念,提升多线程编程的能力。同时,文档中的代码示例能帮助读者更好地理解和...
Java多线程是Java编程中的一个核心概念,它在现代软件开发中扮演着至关重要的角色。多线程允许程序同时执行多个任务,提高了系统资源的利用率,提升了应用程序的响应速度和并发性能。对于大型分布式系统、Web应用...
Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...
《深入学习:Java多线程编程》是一本...通过学习《深入学习:Java多线程编程》,开发者可以提升在复杂并发环境下的编程能力,为开发高并发、高可用的应用打下坚实的基础。这本书无疑是Java开发者进阶必备的参考书之一。
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...
本篇总结涵盖了Java多线程的基础概念、创建与启动、线程调度、同步与协作以及新特性。 **一、Java线程:概念与原理** 1. **线程与进程**: - **进程**:是操作系统资源分配的基本单位,每个进程都有独立的内存...
通过以上分析,我们可以看到,在Java中合理利用单线程或多线程以及`synchronized`关键字能够有效地提高程序的性能和响应能力,同时也需要注意其可能带来的复杂性和资源消耗问题。开发者应根据具体的应用场景和需求来...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
通过分析并实践`threadTest`案例,我们可以深入理解Java多线程的原理和使用技巧,为编写高效并发程序打下坚实基础。同时,也要注意多线程编程中的死锁、活锁和饥饿等问题,合理设计线程间的交互,避免出现不可预期的...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
Java多线程程序设计是Java开发中的重要组成部分,它允许程序在同一时间执行多个任务,从而提高了系统的效率和响应性。本文将深入探讨Java多线程的相关概念和实现方式。 一、理解多线程 1. **线程定义**:线程是一...
在Java编程中,多线程处理是提升程序性能和效率的重要手段,特别是在处理大量数据库数据时。本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等...