首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StampedLock类的tryOptimisticRead()方法到底是如何工作的?

StampedLock类的tryOptimisticRead()方法到底是如何工作的?
EN

Stack Overflow用户
提问于 2020-03-25 11:15:04
回答 1查看 160关注 0票数 0

我正在编写以下代码。

CreateThread.java

代码语言:javascript
复制
import java.util.concurrent.locks.*;
class CreateThread
{   
   public static void main(String[] args)   
   {        
      StampedLock lock = new StampedLock();         
      MyThread[] t = new MyThread[5];       
      for(int i=0; i<2; i++)        
      {         
        t[i] = new MyThread("t"+i, lock);       
      }     
      for(int i=0; i<2; i++)        
      {         
         t[i].start();      
      } 
    }
}

MyThread.java

代码语言:javascript
复制
import java.util.concurrent.locks.*;
public class MyThread extends Thread
{ 
   StampedLock lock = null;    
   public MyThread(String name, StampedLock lock)    
   {    
     super(name);   
     this.lock=lock;    
    }     
    public void run()    
    {       
       long stamp = 0;
       stamp = lock.tryOptimisticRead();        
       System.out.println(Thread.currentThread().getName()+" applied for Lock "+ stamp);
       if(lock.validate(stamp))
       {
        System.out.println(Thread.currentThread().getName()+" got Lock "+ lock);
       }
       try      
       {            
         Thread.sleep(5000);        
       }        
       catch(InterruptedException e){}      
       lock.unlock(stamp);      
     }
}

输出:

代码语言:javascript
复制
t1 applied for Lock 256
t0 applied for Lock 256
t0 got Lock java.util.concurrent.locks.StampedLock@1ce4c0a1[Unlocked]
t1 got Lock java.util.concurrent.locks.StampedLock@1ce4c0a1[Unlocked]
Exception in thread "t0" java.lang.IllegalMonitorStateException
    at java.base/java.util.concurrent.locks.StampedLock.unlockRead(StampedLock.java:722)
    at java.base/java.util.concurrent.locks.StampedLock.unlock(StampedLock.java:738)
    at MyThread.run(MyThread.java:24)
Exception in thread "t1" java.lang.IllegalMonitorStateException
    at java.base/java.util.concurrent.locks.StampedLock.unlockRead(StampedLock.java:722)
    at java.base/java.util.concurrent.locks.StampedLock.unlock(StampedLock.java:738)
    at MyThread.run(MyThread.java:24)

看起来这两个线程都没有读锁。这个方法是如何工作的?

EN

回答 1

Stack Overflow用户

发布于 2020-03-26 00:46:26

tryOptimisticRead确实不会锁定。为此,请使用readLock方法。您可以使用tryOptimisticRead来检查其他线程是否使用validate更改了锁中的某些内容。您不需要解锁某些内容,因为您没有锁定任何内容

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60842517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档