在Java应用中,使用多线程进行工作的需要是越来越多,使用多线程进行工作,大大的提高了系统的工作效率,然而因此而产生的问题也是层出不穷,而且因为多线程而产生的问题跟踪是一个难题。
同步的概念:
同步分为 方法同步 和 同步块 两种方式。
使用同步的原因
1. 在系统中对访类要使用多线程进行访问;
2. 在该类中有 类变量, 或者是 在类的方法中有访问 公共资源(如一个外部文件的读写)。
同步所锁定的内容是什么?
无论你将Synchronized加在方法前还是加在一个变量前,其锁定的都是一个 类对象。 每一个对象都只有一个锁与之相关联。
下例中分情况的列举各种情况下的同步效果
1. Synchronized 加在方法上, (方法同步)
public synchronized void function1(){ ……}
public void function2(){
synchronized (this){……}
……}
这两种写法的效果是一样的,锁定的都是类实例对象。
如果有一个 类实例对象: inst = new ClassSynInst(),
另外有两个线程: threada,threadb,都调用了inst 对象,那么,在同一时间,如果 threada调用了inst.function1(),则threadb在该时间内不能访问inst.function1() 和 inst.function2(); 因为threada把inst这个对象的锁使用了,所以无法分给其它线程使用
但是,如果threada调用 inst1.function1(), threadb调用 inst2.function1(), 则可以同时进行,因为它们调用的是不同的ClassSynInst类对象实例。
2. Synchronized 加在变量上, (同步块)
Object a = new Object();
Object b = new Object();
public void function1(){
synchronized (a){……}
……}
public void function2(){
synchronized (b){……}
……}
这种情况下,是实现代码块锁定,锁定的对象是 变量 a 或 b; (注意,a 、b 都是非static 的)
如果有一个 类实例对象: inst = new ClassSynInst(),
另外有两个线程: threada,threadb,都调用了inst 对象,那么,在同一时间,如果 threada调用了inst.function1(),则threadb在该时间内可以访问inst.function2(); 但不能访问 inst.function1() 的同步块, 因为a被 threada锁定了。
3. Synchronized 锁定的是 类变量 ,即static 变量
class Test{
static Object o= new Object();
public static synchronized void f1(){ ……}
public static void f2(){
synchronized(Test.class){ ……}
}
public static void f3(){
try {
synchronized (Class.forName("Test")) { ……}
}
catch (ClassNotFoundException ex) {
}
}
public static void f4(){
synchronized(o){ ……}
}
}
以上4个方法中实现的效果都是一样的,其锁定的对象都是类Test,而不是类实例对象 ,即在多线程中,其共享的资源是属于类的,而不是属于类对象的。
在这种情况下,如果threada 访问了这4个方法中的任何一个, 在同一时间内其它的线程都不能访问 这4个方法。
4. 类的方法中访问了多线程共同的资源, 且该资源是可变的,这种情况下也是需要进行同步的
例:
class test {
static String path = “ file path”;
public void readConfiFile(){
synchronized (path){
// 读取该path指定的文件。
}
}
public void writeConfiFile(){
synchronized (path){
// 写信息到该path指定的文件。
}
}
}
这种情况下,必须锁定为 类变量,而不能进行锁定类实例对象,因为这是变象的一种类资源共享,而不是类实例对象资源共享。
分享到:
相关推荐
### Java synchronized 关键字详解 #### 一、synchronized关键字简介 `synchronized`是Java语言提供的关键字之一,用于实现线程间的同步控制。通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个...
"Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...
Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...
在Android开发中,`synchronized`关键字是Java语言中用于实现线程同步的重要工具,它在多线程环境下确保了共享资源的安全访问。本测试案例深入探讨了`synchronized`的使用方法,包括同步单个对象、同步多个对象以及...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源,以保证数据的一致性和完整性。这个关键词提供了互斥锁机制,防止多个线程同时执行同一段代码,确保了线程安全。 一、`...
在Java编程语言中,`synchronized`关键字是一个重要的并发控制机制,用于确保多线程环境下的数据一致性。本文将深入探讨`synchronized`的几种使用示例,包括方法加锁、代码块加锁(针对`this`和对象)以及静态方法...
### volatile与synchronized的区别 #### 一、锁的特性:互斥与可见性 在并发编程中,锁作为实现线程安全的一种手段,其核心作用在于提供两种特性:互斥和可见性。 - **互斥**:互斥是指在任何时刻,只允许一个...
"Java 锁机制 Synchronized" Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被...
在Java多线程编程中,`synchronized`关键字是一个至关重要的工具,用于实现线程间的同步,以确保共享资源的安全访问。本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ##...
在Java编程语言中,`synchronized`关键字是一个非常重要的并发控制机制,用于保证多线程环境下的数据一致性。本文将深入解析`synchronized`的工作原理、使用方式以及它在并发编程中的重要性。通过分析提供的源码,...
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...
### synchronized关键字的深入解析 #### 一、synchronized关键字的重要性 `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多...
《深入理解Java中的synchronized关键字》 在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要工具,它的本质在于确保多线程环境下的数据一致性与安全性。通过`synchronized`,我们可以控制对共享资源...
### Synchronized关键字在Java中的应用 #### 概述 `synchronized`是Java语言中的一个关键字,主要用于实现线程同步,防止多个线程同时访问共享资源而导致的数据不一致问题。通过`synchronized`关键字,开发者可以...
在Java编程语言中,`synchronized`关键字是一个至关重要的概念,它主要用于实现线程同步,以确保多线程环境下的数据一致性与安全性。本篇文章将深入探讨`synchronized`的使用,包括其基本原理、使用方式以及实际应用...
Java中的`synchronized`关键字是多线程编程中用于同步控制的关键元素,它的主要目标是解决并发环境下多个线程对共享资源的访问冲突。在Java中,由于线程共享内存空间,如果没有适当的同步机制,可能会导致数据不一致...
在这个项目中,开发者利用`synchronized`关键字来实现线程同步,确保数据在生产与消费过程中的安全。 `synchronized`是Java中用于实现线程互斥的关键字,它提供了对共享资源的独占访问。当一个线程进入由`...
在Java编程中,synchronized和ReentrantLock都是用于实现线程同步的重要工具,它们在并发控制方面扮演着关键角色。然而,两者之间存在一些显著的区别,这些差异体现在功能、灵活性、性能以及使用场景上。 首先,...
`@synchronized`关键字是Apple提供的一种简便的同步机制,它可以帮助开发者确保在多线程环境下对共享资源进行原子性操作,防止数据竞争问题。本文将深入探讨`@synchronized`的工作原理、特点以及使用时需要注意的...