如何理解之间的线程安全

  介绍

本篇内容介绍了”如何理解之间的线程安全”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

<代码> ArrayBlockingQueue> ReentrantLock 保证的,因此在元素出入队列操作时,无需额外加锁。写一段简单的代码举个例子,从具体的使用来说明它的线程安全吧

 ArrayBlockingQueue,队列=new  ArrayBlockingQueue (7
  ,,,,,,,真的,,new  ArrayList&肝移植;和gt; (arrays . aslist (new 整数[]{1,2,3,4,5,6,7})));
  
  @AllArgsConstructor
  class  Task  implements  Runnable {
  ,,,String  threadName;
  ,,@Override
  ,,,public  void 运行(),{
  ,,,,,,,,(真正的),{
  ,,,,,,,,,,,try  {
  ,,,,,,,,,,,,,,,System.out.println (threadName +“,:,“+ queue.take ());
  ,,,,,,,,,,,},catch  (InterruptedException  e), {
  ,,,,,,,,,,,,,,,e.printStackTrace ();
  ,,,,,,,,,,,}
  ,,,,,,,}
  ,,,}
  }
  
  private  void  queueTest () {
  ,,,new 线程(new 任务(“Thread  1“)) .start ();
  ,,,new 线程(new 任务(“Thread  2“)) .start ();
  }

在代码中创建队列时就往里放入了7个元素,然后创建两个线程各自从队列中取出元素。对队列的操作也非常简单,只用到了操作队列中出队方法<代码> ,运行结果如下:

 Thread  1,: 1
  Thread  2,: 2
  Thread  1,: 3
  Thread  2,: 4
  Thread  1,: 5
  Thread  2,: 6
  Thread  1,:, 7 

可以看到在公平模式下,两个线程交替对队列中的元素执行出队操作,并没有出现重复取出的情况,即保证了多个线程对资源竞争的互斥访问。它的过程如下:

如何理解之间的线程安全

面试官:那它的阻塞性呢?

九头蛇:好的,还是写段代码通过例子来说明

 private  static  void  queueTest (), throws  InterruptedException  {
  ,,,ArrayBlockingQueue,队列=new  ArrayBlockingQueue&肝移植;和gt; (3);
  ,,,int 大?7;
  ,,,Thread  putThread=new 线程(()和gt; {
  ,,,,,,,for  (int 小姐:=,0;,小姐:& lt; size ;,我+ +),{,try  queue.put (i);, system.out.println (“putthread 说:,“+我+“,安康;大小:“+ queue.size ());, thread . sleep (1000);,}, catch  (interruptedexception  e), e.printstacktrace ();,});, thread  takethread=皀ew",线程(()祝辞,{
  ,,,,,,,for  (int 小姐:=,0;,小姐:,lt;,大小+ 1,,,我+ +),{
  ,,,,,,,,,,,try  {
  ,,,,,,,,,,,,,,,thread . sleep (3000);
  ,,,,,,,,,,,,,,,System.out.println (“TakeThread :,“+ queue.take ());
  ,,,,,,,,,,,},catch  (InterruptedException  e), {
  ,,,,,,,,,,,,,,,e.printStackTrace ();
  ,,,,,,,,,,,}
  ,,,,,,,}
  ,,,});
  
  ,,,putThread.start ();
  ,,,thread . sleep (1000);
  ,,,takeThread.start ();
  }

和第一个例子中的代码不同,这次我们创建队列时只指定长度,并不在初始化时就往队列中放入元素。接下来创建两个线程,一个线程充当生产者,生产产品放入到队列中,另一个线程充当消费者,消费队列中的产品,需要注意生产和消费的速度是不同的,生产者每一秒生产一个,而消费者每三秒才消费一个。执行上面的代码,运行结果如下:

 PutThread 把:,0,安康;大小:1
  PutThread 把:,1,安康;大小:2
  PutThread : 2,安康;大小:3
  TakeThread 花:0
  PutThread 把:,3,安康;大小:3
  TakeThread 采取:1
  PutThread : 4,安康;大小:3
  TakeThread 花:2
  PutThread : 5,安康;大小:3
  TakeThread 花:3
  PutThread : 6,安康;大小:3
  TakeThread 花:4
  TakeThread 需要:5
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

如何理解之间的线程安全