线程与锁大多数情况下,我们都是编写单线程来完成我们的工作。但是多线程技术是充分利用计算机资源,并且提高程序性能的必经之路,所以在这里,向大家介绍多线程,以及锁的概念。 每个Java虚拟机都可以支持一次执行多个线程。这些线程独立运行,操作符及对象驻留在内存中。线程可以被多处理器、单处理器以时间片划分,多处理器以时间片划分的硬件所支持。 Java程序语言由于提供了同步并发线程活动的机制,因而在程序中如果发生并发,仍然表现稳定。为了同步线程,Java程序语言使用了“监视器”,这是一种高层的机制,它允许在一个周期中只能有一个线程,执行由监视器所保护的代码的一部分。监视器的行为就如同锁一样;所有的对象都联系着一把锁。 同步表达式执行二种指定活动,只联系于多线程操作:(1)在运行介绍一个对象之后,在执行前先执行它:在这个对象上加一把锁,并且(2)当对象执行完成之后,无论正常或异常,都将这把锁打开。简单地说,一个方法可以被定义同步;这样,一个方法的行为就包含在了了同步语句中。 wait,notify,以及notifyall所有的类的对象的方法支持一个有效的线程间的转换控制。胜过简单的“spinning”(重复地对一个对象锁定、解除锁定来观察他们的内部状态有什么改变),它消费了计算的成果,一个线程通过使用wait来将自己挂起,些时另一个线程被它使用的notify而唤醒。尤其当线程间的关系是供—产关系时(活路地协作于同一个目标)要比相互排斥的线程(当共享一个共用资源时避免冲突)更加适合。 作为一个运行的代码线程,它实现一系列的活动。线程可以使用变量的值或者赋于变量一个值。(别外一些行为,包括算术操作,条件测试,方法指示,但是它们并不直接调用变量。)如果在一个共享变量被两个或更多的并发线程争用,这种情况下可能会产生时间依赖性的结果。这个对于时间性的依赖是并发程序设计所固有的。 每个线程有一个工作内存区,它可以用来保存内存中所有线程所共享的变量的值的一个拷贝。访问一个共享变量,一个线程通常首先获得一个锁并且刷新其工作内存区。这就保证了这个共享变量将从那以后会从共享内存中装入到这个线程的工作内存中去。 这里阐述了线程在内存间的访问。当有低层活动出现时,是有一些规则来制约它们的。这些规则严格地限制了Java程序设计语言的实现,并且一个程序员需要依照这些规则来计划在并行程序中可能的行为。无论如何,这些规则有意地留给了实现程序一些自由,这是为了在某些标准软、硬件技术中使并行程序代码运行时的速度以及效率得以提高,术语与框架 一个变量是一个程序可以存放东西的区域。 简要地说一下这些规则的重要结果: ·适当使用同步结构将允许线程之间通过共享变量可靠地传递值或值的集合 ·当一个线程使用一个变量的值时,它获得的的值实际上是一个被那个线程或另外一些线程所保存在一个变量中的值。即使程序中不包括正确同步,也是这样的。比如:如果两个线程保存了两个不同对象的声明到一个相同的声明值,这个变量值将随后包含了一个对象或另一个的声明,而不是另外一些对象的声明或是被破坏的声明值。(这一个一long或double型值的异常)。 ·在缺乏直接同步的情况下,一个实现在内存中自由地更新。 术语及框架 一个变量是在程序中可能被存储的区域。这不但包括了类变量及实例变量,而且也包括了数组变量。变量驻留在内存中可以被所有线程所访问。因为一个线程不可能访问参数或另一个线程的本地变量,它也并不关心参数和本地变量是否考虑到了共享内存及线程的工作内存。 每个线程有一个工作内存,它用来保存它需要使用的变量的拷贝。当一个线程运行一个程序,它操纵它们。主存中则包含每个变量的主要拷贝。当一个线程被允许或请求传送内容的工作拷贝到主要拷贝时的规则反之亦然。 主存中也包括锁;一个锁与一个对象相关联。线程通过竞争而获得锁。 这里,use(使用),assign(指定)load(载入),store(存储),lock(锁定),和unlock(解锁)命名了一个线程的活动。而read(读取),write(写入),lock(锁定),unlock(解锁),命名了主存中的子系统的活动。这里的每一个活动都是原子性的(不可分的) use(使用)或assign(指定)活动是在线程运行引擎与线程工作内存中紧密相关的一对。 Lock(锁定)或unlock(解锁)活动是主存与线程运行引擎中紧密相关的一对。但是主存与线程工作内存中的数据传送器是比较松散的。当数据从主存被复制到工作内存中时,产生两个活动:读取活动通过主存执行,而随后通过工作内存执行load(载入)。当数据从工作内存中复制到主存中去时,也产生两个活动:store(存储)活动在工作内存中执行,随后相应在主存中执行write(写入)活动。在主存和工作内存中会产生传送时间,并与其它传送不同;因此活动被通过线程或者是被另一个线程观察的变量以产生的不同顺序所启动。对于每个变量,任何一个线程在执行时的获益在与其它的对应线程中的一样。(这将在后面详细阐述)。 一个单线程生成use(使用)、assign(指定),lock(锁定)与unlock(解锁)的流,同正在执行的程序的语义所指定的一样。而潜在的实现过程是被请求加入到执行的适当过程中load,(载入),store(存储),read(读取),write(写入)活动,只需遵守某些约束的集合。如果实现过程遵循这些规则,而且应用程序设计者也遵循这些设计规则,那么数据可以可靠地在线程和共享变量间传送。规则被设计地足够地严密以使其可能,但是又松散地足够允许软、硬件设计者能够有足够大的空间来增进速度及吞吐量,通过这种“寄存器,队列,缓存”机制。 这里是每个活动的详细定义: ·’use(使用)(由线程)’传送一个变量的工作拷贝的线程的内容到线程运行引擎。当一个线程运行一个虚拟机的指令,它需要使用变量的值时,这个活动被执行。 ·“assign”(指定)(由线程)从线程运行引擎传送一个值到线程工作变量的拷贝中去。这个活动当一个线程运行需要指定一个变量的虚拟机的指令时执行。 上一篇:Java的网络知识 下一篇:你的第一个Java(for UNIX(Linux)) 更多相关文章
|
推荐文章
精彩文章
|