同步是建立在一个内部的实体上,被称作内在锁或者监视锁。(同步锁的api中经常涉及这个实体的简单的称作“监视器”)内在锁在同步的两方面都扮演了一个角色:强制占有一个对象的状态和建立happens-before关系,这样基本上可见。
每个对象都有一个与之关联的内在锁。按照惯例,一个线程,需要独占和一致的一个对象的字段,在进入这个对象前得需要这个对象的内在锁,当处理完这些字段后,需要释放这些内在锁。只有有一个线程拥有一个内在锁,其他的线程就不能获取这同样的锁。当其他试图获取这把锁时将被阻塞。
当一个线程释放了内在锁,就在那个动作和同一把锁的子需求之间建立了happens-before的关系。
在同步方法中的锁
当线程调用同步方法时,它自动的为这个方法的对象获取一个内在锁并在方法返回的时候释放锁。即使返回是由于一个异常导致的,锁释放也会发生。
你可能想知道当一个static 同步方法被调用的时候会发生什么,因为一个静态方法是与一个类关联的,而不是一个对象。在这种情况下,线程为与这个类关联的类对象获取内在锁。然后进入被锁控制的类的静态字段,那与任何类的一个实例的锁是有明显区别的。
同步语句
另一种方法创建synchronized代码通过同步语句。不像同步方法,同步语句必须指定提供内在锁的的对象:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
在这个例子中,addName方法需要多lastName和nameCount字段有一个同步变化,但也需要避免其他对象方法的同步调用。(从同步代码中调用其他对象的方法会引发一些问题,这些会在活性这部分讲述)。没有同步块,不得不将有一个分开的,非同步的方法来调用nameList.add。
同步块也对改进有细粒度的同步的并发有用。例如,类MsLunch有两个实例字段,从不一起使用。所有这些字段的更新都是同步的。但是没有理由阻止c1的更新从交错排列的c2的更新--并这样做通过创建非必要阻塞减少并发。代替同步方法或者与之使用与之相关的锁,我们单独的创建两个对象来提供锁。
public class MsLunch {
private long c1 = 0;
private long c2 = 0;
private Object lock1 = new Object();
private Object lock2 = new Object();
public void inc1() {
synchronized(lock1) {
c1++;
}
}
public void inc2() {
synchronized(lock2) {
c2++;
}
}
}
使用这种极端保健的方式。你必须绝对确定受影响的字段的内在锁是安全的。
可重入同步(Reentrant Synchronization)
回顾那个一个线程不能获取另一个线程拥有的锁。但是一个线程可以获取它已经拥有的锁。可重入同步允许一个线程多次获取同样的锁成为可能。这描述了一种情形同步代码直接或者间接调用一个包含了同步代码的方法,并且两组代码使用相同的锁。没有可重入同步,同步代码将不得话费更多的措施来避免一个线程调用自身来阻塞。
分享到:
相关推荐
两者各有优势,如管道简单高效,适合简单的数据传递,而消息队列则适合需要更高级别同步和数据结构的场景。 此外,实验还涵盖了进程间的内存共享编程,这是一种高效的通信方式,允许多个进程访问同一块内存区域,...
在提供的压缩包文件“lj通过共享内在中的数据实现进程间的通信”中,应该包含了具体的代码示例,演示了如何在VC++中创建、访问和同步共享内存。学习和理解这些示例,有助于深入掌握共享内存的使用方法。 总之,共享...
Java 1.5引入了并发包(`java.util.concurrent`),为开发者提供了丰富的工具来管理和控制线程,其中就包括了显式锁(`java.util.concurrent.locks.Lock`)。本示例"OrderingMultipleThreadsUsingExplicitLock"主要讲解...
1. **进程管理**:内核如何创建、调度和管理进程,包括进程的状态转换、调度算法(如抢占式调度、实时调度)、信号量和互斥锁等同步机制,以及进程间通信(IPC)的方式。 2. **内存管理**:探讨了虚拟内存的概念,...
这包括接纳自己的身材、容貌,以及内在的特质和能力(如选项A①②④所述)。过分关注外在形象可能导致自我价值感下降,因此要注重内心的成长和个性的发展。 3. 悦纳自我:"承受自己的不完美,每天给自己一个美丽的...
2. **同步机制**:包括Locks(互斥锁)、Barriers(屏障)、Semaphores(信号量)和Condition Variables(条件变量),用于控制线程间的协作和同步。 3. **运行时环境变量**:允许访问threadid(线程ID)和num of ...
首先,“明明德”强调个人内在德性的发扬,鼓励人们自我提升,发掘并展现自身的美德。其次,“亲民”是指将个人的修养延伸到社会,通过亲近和教化民众来提升整个社会的道德水平。最后,“止于至善”是指追求道德的...
不能,Java中的同步块或同步方法要求内在锁必须是对象类型。 1.33 内在锁的重入性。synchronized同步块是可重入的,即同一个线程可以获得同一个同步块的多次锁。 1.34 什么是原子操作。在Java中,原子操作是不可...
8. 正确认识自我:了解自己应该全面而客观,既看到内在素质,又关注外在形象,同时注意到自己的优点和不足。因此,正确的方法是D选项,即用全面的、发展的的眼光看自己。 9. 追星行为及其影响:杨丽娟的行为属于...
在多线程编程中,同步和通信是两个关键概念。μCOS-II提供了多种同步机制,如信号量、互斥锁和事件标志组,用于控制对共享资源的访问。信号量用于计数和资源分配,互斥锁确保同一时间只有一个任务访问特定资源,而...
进程同步和通信是另一个重要主题。在多任务环境中,进程间的协作至关重要,这通常通过信号量、互斥锁、条件变量等机制实现。章节会详细阐述这些同步原语的使用,以及死锁的概念和避免策略。 调度是决定哪个进程应该...
《范进中举》是清代文人吴敬梓创作的一篇...它提醒我们,不应过于看重外在的权力和地位,而应关注个人内在的价值和成长。同时,这部作品也警示现代社会,要避免重蹈覆辙,构建一个更加公平、尊重个人价值的社会环境。
这些问题领域涉及到领导者选举、互斥一致性、时钟同步等经典分布式系统问题,并且包含了快速互斥算法、队列锁、分布式共享存储器、无锁层级和故障检测器等最新技术。书中涵盖了分布式计算理论的主要内容,强调了不同...
此外,ConcurrentHashMap 还提供了其他高级特性,如支持原子操作的 putIfAbsent()、remove() 和 replace() 方法,这些方法能够在不使用额外同步的情况下保证操作的原子性。这些特性使得在并发编程中更易于保证数据的...
”这句表达了贝多芬对于音乐创作的独特见解,他认为真正的音乐来自内心,而非外界的乐队演奏,强调了音乐的内在性和个人表达的重要性。 4. 对课文的深入探究可能包括:贝多芬的创作灵感来源、他在困难中的心态变化、...
2. **线程同步**:为了解决多线程环境下的数据一致性问题,Java提供了多种同步机制,如synchronized关键字、volatile变量、java.util.concurrent包下的锁(如ReentrantLock)以及并发工具类(如Semaphore、...
本书详细解读了这些工具的使用和它们内在的原理,帮助开发者能够更好地管理和维护多线程程序。 除了讲述基础概念和同步机制,本书还着重介绍了Java内存模型(Java Memory Model),这是理解Java并发编程的关键部分...
这些集合类在设计上兼顾了并发性能和线程安全,避免了传统的同步锁带来的性能开销。 此外,书中可能还会介绍到线程间的通信,如`BlockingQueue`,它是生产者-消费者模式的一种实现,可以有效地协调不同线程间的工作...
书中会讲解各种调度策略、线程创建和同步原语,如互斥锁、条件变量和信号量。 8. **错误处理和调试技巧**:学习任何编程环境,理解和处理错误都是必不可少的。书中会介绍如何解读错误码、使用strerror函数,以及...
Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized ...