首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

应用synchronized和Lock对象获取对象锁

2012-12-22 
使用synchronized和Lock对象获取对象锁在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。所有对象

使用synchronized和Lock对象获取对象锁
在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。所有对象都自动含有单一的锁。JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。当使用同步块时,如果方法下的同步块都同步到一个对象上的锁,则所有的任务(线程)只能互斥的进入这些同步块。Resource1.java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,虽然这些同步块处在不同的方法中,但由于是同步到同一个对象(当前对象 synchronized (this)),所以对它们的方法依然是互斥的。package com.zj.lock;import java.util.concurrent.TimeUnit;?public class Resource1 {??? public void f() {?????? // other operations should not be locked...?????? System.out.println(Thread.currentThread().getName()????????????? + ":not synchronized in f()");?????? synchronized (this) {?????????? for (int i = 0; i < 5; i++) {????????????? System.out.println(Thread.currentThread().getName()???????????????????? + ":synchronized in f()");????????????? try {????????????????? TimeUnit.SECONDS.sleep(3);????????????? } catch (InterruptedException e) {????????????????? e.printStackTrace();????????????? }?????????? }?????? }??? }???? public void g() {?????? // other operations should not be locked...?????? System.out.println(Thread.currentThread().getName()????????????? + ":not synchronized in g()");?????? synchronized (this) {?????????? for (int i = 0; i < 5; i++) {????????????? System.out.println(Thread.currentThread().getName()???????????????????? + ":synchronized in g()");????????????? try {????????????????? TimeUnit.SECONDS.sleep(3);????????????? } catch (InterruptedException e) {????????????????? e.printStackTrace();????????????? }?????????? }?????? }??? }???? public void h() {?????? // other operations should not be locked...?????? System.out.println(Thread.currentThread().getName()????????????? + ":not synchronized in h()");?????? synchronized (this) {?????????? for (int i = 0; i < 5; i++) {????????????? System.out.println(Thread.currentThread().getName()???????????????????? + ":synchronized in h()");????????????? try {????????????????? TimeUnit.SECONDS.sleep(3);????????????? } catch (InterruptedException e) {????????????????? e.printStackTrace();????????????? }?????????? }?????? }??? }???? public static void main(String[] args) {?????? final Resource1 rs = new Resource1();??????? new Thread() {?????????? public void run() {????????????? rs.f();?????????? }?????? }.start();??????? new Thread() {?????????? public void run() {????????????? rs.g();?????????? }?????? }.start();??????? rs.h();??? }Thread-0:not synchronized in f()Thread-0:synchronized in f()main:not synchronized in h()Thread-1:not synchronized in g()Thread-0:synchronized in f()Thread-0:synchronized in f()Thread-0:synchronized in f()Thread-0:synchronized in f()Thread-1:synchronized in g()Thread-1:synchronized in g()Thread-1:synchronized in g()Thread-1:synchronized in g()Thread-1:synchronized in g()main:synchronized in h()main:synchronized in h()main:synchronized in h()main:synchronized in h()Resource1.java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,这些同步块处在不同的方法中,并且是同步到三个不同的对象(synchronized (this),synchronized (syncObject1),synchronized (syncObject2)),所以对它们的方法中的临界资源访问是独立的。package com.zj.lock;import java.util.concurrent.TimeUnit;?public class Resource2 {??? private Object syncObject1 = new Object();??? private Object syncObject2 = new Object();???? public void f() {?????? // other operations should not be locked...?????? System.out.println(Thread.currentThread().getName()????????????? + ":not synchronized in f()");?????? synchronized (this) {?????????? for (int i = 0; i < 5; i++) {????????????? System.out.println(Thread.currentThread().getName()???????????????????? + ":synchronized in f()");????????????? try {????????????????? TimeUnit.SECONDS.sleep(3);????????????? } catch (InterruptedException e) {????????????????? e.printStackTrace();????????????? }?????????? }?????? }??? }???? public void g() {?????? // other operations should not be locked...?????? System.out.println(Thread.currentThread().getName()????????????? + ":not synchronized in g()");?????? synchronized (syncObject1) {?????????? for (int i = 0; i < 5; i++) {????????????? System.out.println(Thread.currentThread().getName()???????????????????? + ":synchronized in g()");????????????? try {????????????????? TimeUnit.SECONDS.sleep(3);????????????? } catch (InterruptedException e) {????????????????? e.printStackTrace();????????????? }?????????? }?????? }??? }???? public void h() {?????? // other operations should not be locked...?????? System.out.println(Thread.currentThread().getName()????????????? + ":not synchronized in h()");?????? synchronized (syncObject2) {?????????? for (int i = 0; i < 5; i++) {????????????? System.out.println(Thread.currentThread().getName()???????????????????? + ":synchronized in h()");????????????? try {????????????????? TimeUnit.SECONDS.sleep(3);????????????? } catch (InterruptedException e) {??

热点排行