出自
http://blog.csdn.net/lazy_tiger/article/details/1820582
Java关键字synchronized是Java 语言提供的对多线程和同步的一种机制。synchronized可以作为函数的修饰符,也可作为函数内的语句。它可以作用于instance变量,对象引用(object reference),static函数和类名称字面常量(class literals)。
下面介绍一下synchronized的关键字的使用方法:
一、synchronized作函数修饰符
public synchronized void fun()
{
……..
}
fun()就是一个同步方法,此时synchronized关键字锁定的是调用这个同步方法的对象。假设有p1和p2是同一个类的两个对象,p1在不同的线程中运行会对fun()产生互斥和同步的效果;但是p2对象和p1对象互相不会对fun()产生同步和互斥作用(当然,不同线程中的p2对象的fun()还是有同步和互斥)。
对于非static的情况,synchronized是对象级别的,其实质是将synchronized作用于对象引用(object reference)上,即拿到p1对象锁的线程,对p1的fun()方法有同步互斥作用,不同的对象之间坚持“和平共处”。因此,上面的代码等同于:
public void fun()
{
synchronized(this) // this指的是调用这个方法的对象
{
……
}
}
二、synchronized同步程序块
public void fun_1(someObject obj)
{
synchronized(obj)
{
……
}
}
上面代码中,锁住的是obj对象(正如前面说的,对于非static的情况,sysnchronized是对象级别的),谁拿到这个锁,谁就可运行obj控制的那段代码。通常情况,如果我们知道对用哪个对象作为锁时,就可以像上面的代码块一样使用synchronized。假如没有明确的对象作为锁,程序员又希望同步一段代码块,就可以使用下面的trick。
class Test implements Runnable
{
private byte[] lock = new byte[0]; // 定一个instance变量
public void fun_2()
{
synchronized(lock)
{
……
}
}
}
在上面的代码示例中,定义了一个特殊的instance变量作为锁,这个instance变量必须是一个对象。定义lock为长度为0的数组对象是最佳方案。在编译后的字节码中,生成长度为0的byte[]只需要三条操作码。假如我们用所有类的超类Object来作锁,需要生成七条操作码。
[注意:]如果需要定义特殊的instance变量作为锁,最好将其定义为private的,同时定义其get()方法(如果使用自己定义的类的对象作为锁)。如果变量是public的,其他类的对象可以得到这个锁的控制权,并修改这个锁。这是非常不安全的。
[注意:] 如果instance变量是一个对象,如数组或ArrayList什么的,那上述方法仍然不安全,因为当外界对象通过get方法拿到这个instance对象的引用后,又将其指向另一个对象,那么这个private变量也就变了,岂不是很危险。这个时候就需要将get方法也加上synchronized同步,并且,只返回这个private对象的clone()――这样,调用端得到的就是对象副本的引用了。
三、synchronized修饰static方法
synchronized静态(static)方法的用法如下面代码示例:
public static synchronized void fun_3()
{
……
}
如果方法用static修饰,synchronized的作用范围就是class一级的,它对类的所有对象起作用。像第一点中的fun()方法,如果是static的,那么synchronized对p1对象和p2对象都起到同步互斥的作用。
其实说白了,对于static的synchronize也可以理解为对象级别的(hoho!是不是有点糊涂了? ^_^),因此下面代码可以达到同样效果:
class XX
{
public static void fun_4()
{
synchronized(XX.class)
{
……
}
}
}
请注意,XX.class也是一个对象,类型是Class,在一个ClassLoader里,它是唯一的。因此,我在前面说,也理解它是对象级别的。
最后简单总结一下:
(1) 通常把synchronized关键字的作用范围划分为类的范围和对象的范围两种,不过偶个人理解的是,既然取得的锁都是对象(参考第三点),也可以认为synchronized关键字都作用于对象。
(2) synchronized关键字是不能继承的,即,父类的synchronized方法在子类中不是synchronized,必须要重新的显式的声明为synchronized才行。
(3) 实现同步需要很大的系统开销,导致延迟等待,甚至可能造成死锁,所以在非多线程情况下不要使用。
分享到:
相关推荐
Linux 同步互斥机制 Linux 同步互斥机制是指在 Linux 内核中实现进程之间的同步和互斥访问共享资源的机制。这种机制主要通过 semaphore 机制和 spin_lock 机制实现。 semaphore 机制是 Linux 内核中最基本的同步...
d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more ...
本篇将详细介绍这两种并发模型以及如何在Linux环境中实现同步互斥。 一、多进程 多进程是指在一个操作系统中同时运行多个独立的程序实体,每个进程都有自己的内存空间,资源独立,进程间通信(IPC)通常通过管道、...
在这个“多线程编程和操作系统线程同步互斥演示”中,作者可能创建了一个或多个人工场景,展示了如何在VC++环境中使用多线程,并且演示了线程同步和互斥的实践应用。这可能涉及到以下几个方面: 1. **线程创建**:...
一个简单的实现同步与互斥的c语言程序,更好理解同步互斥信号量的原理
在操作系统中,同步互斥是多进程或线程环境下确保资源安全访问的关键概念。这些概念主要涉及到进程间通信(IPC)和并发控制,以防止数据竞争和其他并行执行时可能出现的问题。在给出的PPT课件中,通过一系列的作业...
标题:“线程间实现同步互斥的方法” 在多线程环境中,同步是指控制多个线程按预定顺序执行,以避免竞态条件和死锁的发生。而互斥则更专注于确保任何时候只有一个线程能访问特定的共享资源,防止数据的不一致性。 ...
操作系统同步互斥实验是计算机科学领域中的一个重要实践环节,它主要涉及进程的并发执行、资源的共享以及如何避免竞态条件。在这个实验中,学生将深入理解操作系统如何管理和协调多个进程(或线程)的执行,确保数据...
读者/写者的同步互斥问题是一个经典的多线程并发控制问题,在计算机系统设计中尤为重要,尤其是在多用户共享数据资源的场景下。这个问题的核心是确保在并发环境下,数据的一致性和完整性不受影响。以下是对该问题的...
进程同步互斥——不死锁哲学家问题 java实现。计算机系统原理,课程设计,(1)利用进程并发执行原理,采用奇数号哲学家先拿左叉子,偶数号哲学家先拿右叉子的算法解决哲学家就餐问题。 (2)利用java中Swing技术将...
在Unix操作系统中,进程间的通信(IPC,Inter-Process ...通过对`reader.c`、`writer.c`和`my_pipe.c`源代码的分析,以及阅读`进程通讯及同步互斥机制.txt`文档,可以深入理解这些概念并应用到实际项目中。
本案例重点探讨了使用信号量实现的同步互斥的进程间通信,结合了共享内存这一高效的数据交换手段。这里我们将深入解析相关知识点。 首先,让我们了解什么是**信号量(Semaphore)**。信号量是一种同步原语,用于...
【操作系统中的进程间同步互斥】 在操作系统中,进程间的同步和互斥是多线程编程中的核心概念。在银行柜员服务问题中,这些概念得到了实际的应用。该问题模拟了一个银行环境,其中n个柜员为顾客提供服务。为了解决这...
### 解决多线程编程中的同步互斥问题 在现代软件开发中,多线程编程是一种常见的技术,它能够充分利用计算机系统的多核处理能力,提高应用程序的执行效率。然而,多线程编程也带来了一系列复杂的问题,其中最典型的...
同步互斥问题在多进程和多线程编程中是一个核心概念,主要涉及到资源的共享和访问控制。在操作系统中,为了保证并发执行的进程或线程不会产生数据竞争或者死锁,通常会采用信号量机制来实现同步和互斥。 在“同步...
线程的同步互斥是多线程编程中的关键概念,主要用来解决并发执行时的数据安全问题。在Java、C++、Python等支持多线程的编程语言中,线程同步和互斥是确保程序正确性和数据一致性的重要手段。 线程是指在单一进程内...
Java语言中的线程同步互斥研究 1. 引言 在现代计算机系统中,程序的执行都需要占用处理器,因此处理器管理一直是操作系统的核心组成部分。为了合理利用资源,有效调度任务执行,现代操作系统采用并发的方式,调度...
操作系统同步互斥练习题 本文总结了操作系统同步互斥的三个练习题,涉及了信号量的使用、进程同步和互斥的实现。 一、公共汽车同步问题 在公共汽车上,司机和售票员的活动分别是:司机的活动是启动车辆、正常行车...
在标题"jincheng.rar_进程同步互斥"中,我们可以推测这是一个关于实现进程同步和互斥的程序,可能包含了作者在Unix环境下编写的一段代码,即`jincheng.c`。 进程同步是指多个进程在执行过程中,通过某种机制相互...
在银行顾客排队与同步互斥操作的C++源码中,我们主要探讨的是多线程环境下的并发控制问题。在银行场景中,多个顾客需要在不同的柜台进行服务,这就涉及到了资源的竞争和调度,而同步互斥操作是解决这类问题的关键...