知识大全 使用synchronized和Lock对象获取对象锁
Posted hr
篇首语:一个有信念者所开发出的力量,大于个只有兴趣者。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用synchronized和Lock对象获取对象锁相关的知识,希望对你有一定的参考价值。
使用synchronized和Lock对象获取对象锁 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
对象的锁所有对象都自动含有单一的锁
JVM负责跟踪对象被加锁的次数 如果一个对象被解锁 其计数变为 在任务(线程)第一次给对象加锁的时候 计数变为 每当这个相同的任务(线程)在此对象上获得锁时 计数会递增
只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁
每当任务离开一个synchronized方法 计数递减 当计数为 的时候 锁被完全释放 此时别的任务就可以使用此资源
synchronized同步块 同步到单一对象锁当使用同步块时 如果方法下的同步块都同步到一个对象上的锁 则所有的任务(线程)只能互斥的进入这些同步块
Resource java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中 虽然这些同步块处在不同的方法中 但由于是同步到同一个对象(当前对象 synchronized (this)) 所以对它们的方法依然是互斥的
Resource java
package zj lock;
结果
Thread :not synchronized in f() Thread :synchronized in f() main:not synchronized in h() Thread :not synchronized in g() Thread :synchronized in f() Thread :synchronized in f() Thread :synchronized in f() Thread :synchronized in f() Thread :synchronized in g() Thread :synchronized in g() Thread :synchronized in g() Thread :synchronized in g() Thread :synchronized in g() main:synchronized in h() main:synchronized in h() main:synchronized in h() main:synchronized in h() main:synchronized in h()
同步到多个对象锁 Resource java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中 这些同步块处在不同的方法中 并且是同步到三个不同的对象(synchronized (this) synchronized (syncObject ) synchronized (syncObject )) 所以对它们的方法中的临界资源访问是独立的 Resource java
package zj lock;
结果
Thread :not synchronized in f() Thread :synchronized in f() main:not synchronized in h() main:synchronized in h() Thread :not synchronized in g() Thread :synchronized in g() Thread :synchronized in f() main:synchronized in h() Thread :synchronized in g() Thread :synchronized in f() main:synchronized in h() Thread :synchronized in g() Thread :synchronized in f() main:synchronized in h() Thread :synchronized in g() Thread :synchronized in f() main:synchronized in h() Thread :synchronized in g()Lock对象锁 除了使用synchronized外 还可以使用Lock对象来创建临界区 Resource java的演示效果同Resource java Resource java的演示效果同Resource java Resource javapackage zj lock;import ncurrent TimeUnit;import ncurrent locks Lock;import ncurrent locks ReentrantLock;
public class Resource private Lock lock = new ReentrantLock();
public void f() // other operations should not be locked System out println(Thread currentThread() getName() + :not synchronized in f() ); lock lock(); try for (int i = ; i < ; i++) System out println(Thread currentThread() getName() + :synchronized in f() ); try TimeUnit SECONDS sleep( ); catch (InterruptedException e) e printStackTrace(); finally lock unlock();
public void g() // other operations should not be locked System out println(Thread currentThread() getName() + :not synchronized in g() ); lock lock(); try for (int i = ; i < ; i++) System out println(Thread currentThread() getName() + :synchronized in g() ); try TimeUnit SECONDS sleep( ); catch (InterruptedException e) e printStackTrace(); finally lock unlock();
public void h() // other operations should not be locked System out println(Thread currentThread() getName() + :not synchronized in h() ); lock lock(); try for (int i = ; i < ; i++) System out println(Thread currentThread() getName() + :synchronized in h() ); try TimeUnit SECONDS sleep( ); catch (InterruptedException e) e printStackTrace(); finally lock unlock();
public static void main(String[] args) final Resource rs = new Resource ();
new Thread() public void run() rs f(); start();
new Thread() public void run() rs g(); start();
rs h();
结果 Thread :not synchronized in f() Thread :synchronized in f() main:not synchronized in h() Thread :not synchronized in g() Thread :synchronized in f() Thread :synchronized in f() Thread :synchronized in f() Thread :synchronized in f() main:synchronized in h() main:synchronized in h() main:synchronized in h() main:synchronized in h() main:synchronized in h() Thread :synchronized in g() Thread :synchronized in g() Thread :synchronized in g() Thread :synchronized in g() Thread :synchronized in g() Resource java package zj lock; import ncurrent TimeUnit; import ncurrent locks Lock; import ncurrent locks ReentrantLock;
public class Resource private Lock lock = new ReentrantLock(); private Lock lock = new ReentrantLock(); private Lock lock = new ReentrantLock();
public void f() // other operations should not be locked System out println(Thread currentThread() getName() + :not synchronized in f() ); lock lock(); try for (int i = ; i < ; i++) System out println(Thread currentThread() getName() + :synchronized in f() ); try TimeUnit SECONDS sleep( ); catch (InterruptedException e) e printStackTrace(); finally lock unlock();
public void g() // other operations should not be locked System out println(Thread currentThread() getName() + :not synchronized in g() ); lock lock(); try for (int i = ; i < ; i++) System out println(Thread currentThread() getName() + :synchronized in g() ); try TimeUnit SECONDS sleep( ); catch (InterruptedException e) e printStackTrace(); finally lock unlock();
public void h() // other operations should not be locked System out println(Thread currentThread() getName() + :not synchronized in h() ); lock lock(); try for (int i = ; i < ; i++) System out println(Thread currentThread() getName() + :synchronized in h() ); try TimeUnit SECONDS sleep( ); catch (InterruptedException e) e printStackTrace(); finally lock unlock();
public static void main(String[] args) final Resource rs = new Resource ();
new Thread() public void run() rs f(); start();
new Thread() public void run() rs g(); start();
rs h();
cha138/Article/program/Java/hx/201311/26317相关参考
Java多线程的同步示例及对象锁机制 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java
获取Java对象的大小 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nb
SQLServer数据库对象信息的获取方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在开发
SQLServer数据库对象信息的获取[4] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
SQLServer数据库对象信息的获取[3] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
SQLServer数据库对象信息的获取[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
SQLServer数据库对象信息的获取[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs
知识大全 jquery获取iframe中的dom对象(两种方法)
父窗口中操作iframe$(windowframes["iframeChild"]document)//假如iframe的id为iframeChild在子窗口中操作父窗口$(windowparen
知识大全 如何自动获取Oracle数据库启动时在Shared pool里面的对象
如何自动获取Oracle数据库启动时在Sharedpool里面的对象 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快
typeof 支持基本类型的获取比如booleanstringnumberfunctionobjectundefined 用法 varv=true;//"string" typeofv;/