zoukankan      html  css  js  c++  java
  • synchronized关键字

    synchronized关键字的用法详解:

    第一个用法:对象锁

      代码块形式:手动指定锁对象;

    Object lock1 = new Object();
    Object lock2 = new Object();
    
        @Override
        public void run() {
            synchronized (lock1) {
                System.out.print("线程:" + Thread.currentThread().getName() + "的lock1开始啦
    ");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.print("线程:" + Thread.currentThread().getName() + "的lock1结束啦
    ");
            }
            synchronized (lock2) {
                System.out.print("线程:" + Thread.currentThread().getName() + "的lock2开始啦
    ");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.print("线程:" + Thread.currentThread().getName() + "的lock2结束啦
    ");
            }
        }

      方法锁形式:synchronized修饰普通的方法,锁对象默认为this;

    public synchronized void method(){
            System.out.print("线程:" + Thread.currentThread().getName() + "的lock1开始啦
    ");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print("线程:" + Thread.currentThread().getName() + "的lock1结束啦
    ");
        }
    public void run() {
          method();  
    }

    第二个用法:类锁

      java类有很多个对象,但是只有一个类(class), 类锁即是class对象的锁。

      形式1:static 方法加锁;

    @Override
        public void run() {
            method();
        }
        //类锁1
        static synchronized void method(){
            System.out.print("线程:" + Thread.currentThread().getName() + "的类锁1开始啦
    ");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.print("线程:" + Thread.currentThread().getName() + "的类锁1结束啦
    ");
    
        }

      形式2:synchronized(*.class);

    @Override
        public void run() {
            synchronized (SynchronizedRequest2.class){
                System.out.print("线程:" + Thread.currentThread().getName() + "的类锁1开始啦
    ");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.print("线程:" + Thread.currentThread().getName() + "的类锁1结束啦
    ");
            }
        }

    对象锁是实例级别的锁,所以在测试类中,只要使用同一个类的单例runnable就可以让线程1和线程2串行化执行;

    类锁是类级别的锁,所以在测试类中,需要检验的是同一个类的不同实例。

    可重入性:

    锁的可重入性质是线程级别的,与对象无关。无论是递归,两个同步方法,继承类的重写同步方法,都可以重入。

  • 相关阅读:
    mongodb 报错问题
    Android中Is library配置的作用
    Ubuntu 12.04 中安装和配置 Java JDK
    (转)Android开发把项目打包成apk
    (转)Android--使用Canvas绘图
    Android_Gallery(画廊)
    android组件
    Android中px dpi dip density densityDpi 的相关说明
    (转)Android中px与dip,sp与dip等的转换工具类
    (转)谈谈Android中的Rect类——奇葩的思维
  • 原文地址:https://www.cnblogs.com/hekiraku/p/11978337.html
Copyright © 2011-2022 走看看