知识大全 使用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; import ncurrent TimeUnit;   public class Resource     public void f()        // other operations should not be locked        System out println(Thread currentThread() getName()               + :not synchronized in f() );        synchronized (this)            for (int i = ; i < ; i++)               System out println(Thread currentThread() getName()                      + :synchronized in f() );               try                   TimeUnit SECONDS sleep( );               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 = ; i < ; i++)               System out println(Thread currentThread() getName()                      + :synchronized in g() );               try                   TimeUnit SECONDS sleep( );               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 = ; i < ; i++)               System out println(Thread currentThread() getName()                      + :synchronized in h() );               try                   TimeUnit SECONDS sleep( );               catch (InterruptedException e)                   e printStackTrace();                                           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()    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; import ncurrent TimeUnit;   public class Resource     private Object syncObject = new Object();     private Object syncObject = 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 = ; i < ; i++)               System out println(Thread currentThread() getName()                      + :synchronized in f() );               try                   TimeUnit SECONDS sleep( );               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 (syncObject )            for (int i = ; i < ; i++)               System out println(Thread currentThread() getName()                      + :synchronized in g() );               try                   TimeUnit SECONDS sleep( );               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 (syncObject )            for (int i = ; i < ; i++)               System out println(Thread currentThread() getName()                      + :synchronized in h() );               try                   TimeUnit SECONDS sleep( );               catch (InterruptedException e)                   e printStackTrace();                                           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()    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多线程的同步示例及对象锁机制

Java多线程的同步示例及对象锁机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    java

知识大全 获取Java对象的大小

获取Java对象的大小  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  &nb

知识大全 SQL Server数据库对象信息的获取方法

SQLServer数据库对象信息的获取方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在开发

知识大全 SQL Server数据库对象信息的获取[4]

SQLServer数据库对象信息的获取[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs

知识大全 SQL Server数据库对象信息的获取[3]

SQLServer数据库对象信息的获取[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs

知识大全 SQL Server数据库对象信息的获取[2]

SQLServer数据库对象信息的获取[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nbs

知识大全 SQL Server数据库对象信息的获取[1]

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)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 js确定对象类型的方法

  typeof  支持基本类型的获取比如booleanstringnumberfunctionobjectundefined  用法  varv=true;//"string"  typeofv;/