zoukankan      html  css  js  c++  java
  • 二:线程锁 synchronized和lock

    同一把锁(synchronized)锁住的代码一次性只能进一个,就像火车上上厕所,一个进去了,后面要进这个厕所的就需要等待他出来为止,但是如果他是进的别的厕所就不相干了

     1)获取锁的线程执行完了改代码块,然后线程释放对锁的占有;

     2)线程执行发生异常,此时JVM会让线程自动释放

    具体请看下面:

      https://www.cnblogs.com/weibanggang/p/9470718.html

    lock锁(不会自动解锁,一定要手动解锁,所以要和try一起用)

    1.Lock.lock是加锁,如果拿不到就等待:记得和try finally一起用

    2.Lock.trylock 尝试是否拿的到,拿的到就是true拿不到就是false

    3.Lock.lockInterruptibly() 去拿锁,拿不到就等待,可以被中断(是thread.interrupt()这里要注意)

    4.读写锁。读锁的时候其他可以读,写锁的时候其他不能读也不能写

    #代码

      

    package TestLockStudy;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public  class  interruptibly {
        private  Lock lock =  new  ReentrantLock();   
        public  static  void  main(String[] args)  {
            interruptibly test =  new  interruptibly();
            MyThread thread1 =  new  MyThread(test);
            MyThread thread2 =  new  MyThread(test);
            thread1.start();
            thread2.start();
            
            try  {
                Thread.sleep( 2000 );
            }  catch  (InterruptedException e) {
                e.printStackTrace();
            }
            thread2.interrupt();
        }  
        
        public  void  insert(Thread thread)  throws  InterruptedException{
            lock.lockInterruptibly();    //注意,如果需要正确中断等待锁的线程,必须将获取锁放在外面,然后将InterruptedException抛出
            try  {  
                System.out.println(thread.getName()+ "得到了锁" );
                long  startTime = System.currentTimeMillis();
                for (    ;     ;) {
                    if (System.currentTimeMillis() - startTime >= Integer.MAX_VALUE)
                        break ;
                    //插入数据
                }
            }
            finally  {
                System.out.println(Thread.currentThread().getName()+ "执行finally" );
                lock.unlock();
                System.out.println(thread.getName()+ "释放了锁" );
            }  
        }
    }
    
    class  MyThread  extends  Thread {
        private  interruptibly test =  null ;
        public  MyThread(interruptibly test) {
            this .test = test;
        }
        @Override
        public  void  run() {
            
            try  {
                test.insert(Thread.currentThread());
               
            }  catch  (InterruptedException e) {
                System.out.println(Thread.currentThread().getName()+ "被中断" );
            }
        }
    }
    lock中断代码

    详细看:

      https://blog.csdn.net/drdongshiye/article/details/85269808

  • 相关阅读:
    Android中的网络编程
    JAVA 中的IO流
    JAVA网络编程
    JAVA中List的三个子类。
    JAVA中List的几个方法
    JAVA集合中的迭代器的遍历
    JAVA中集合转数组遍历
    【安卓4】事件处理——时间日期事件处理、长按事件
    【安卓4】事件处理——单选按钮触发事件、下拉列表触发事件
    【安卓4】事件处理——单击事件
  • 原文地址:https://www.cnblogs.com/BookMiki/p/14075888.html
Copyright © 2011-2022 走看看