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

    synchronized 作用

      能够保证在同一时刻最多只有一个线程执行该段代码,以达到并发安全的效果

    synchronized的2种用法

    对象锁:包括方法锁(默认锁对象为this当前实例对象)和同步代码块锁(自己指定锁对象)

    代码块形式:

    /**
     * @Description: 对象锁之一,同步代码块锁
     */
    public class Demo1 implements Runnable {
        // 实例
        static Demo1 instance = new Demo1();
        // 自定义对象锁
        Object lock1 = new Object();
        Object lock2 = new Object();
    
        public void run() {
            synchronized (lock1) {
                System.out.println("对象锁的同步代码块,锁lock1,线程名称:"
                        + Thread.currentThread().getName());
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("lock1,"+Thread.currentThread().getName() + "运行结束!");
            }
            synchronized (lock2) {
                System.out.println("对象锁的同步代码块,锁lock2,线程名称:"
                        + Thread.currentThread().getName());
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("lock2,"+Thread.currentThread().getName() + "运行结束!");
            }
        }
    
        public static void main(String[] args) {
            Thread t1 = new Thread(instance);
            Thread t2 = new Thread(instance);
            t1.start();
            t2.start();
            while (t1.isAlive() || t2.isAlive()) {
            }
            System.out.println("finished");
        }
    }

    运行结果如下:

    方法锁形式:

    /**
     * @Description: 对象锁之二,方法锁
     */
    public class Demo2 implements Runnable{
        static  Demo2 instance = new Demo2();
    
        public void run() {
            method();
        }
    
        public synchronized  void method(){
            System.out.println("对象锁的方法修饰符形式,名称:"
                    +Thread.currentThread().getName()
            );
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "运行结束!");
        }
    
        public static void main(String[] args){
            Thread t1 = new Thread(instance);
            Thread t2 = new Thread(instance);
            t1.start();
            t2.start();
            while (t1.isAlive() || t2.isAlive()){
    
            }
            System.out.println(
                    "finished!"
            );
        }
    }
    运行结果如下:

    类锁:指synchronized修饰静态的方法或指定锁为class对象

    1.只有一个class对象:java类可能会有很多个对象,但是只有1个class对象

      2.本质:所以所谓类锁,不过是class对象的锁而已

      3.用法和效果:类锁只能在同一时刻被一个对象所拥有

    静态方法形式:

    /**
     * @Description: 类锁之一,static形式
     */
    public class Demo3 implements Runnable{
        static  Demo3 instance1 = new Demo3();
        static  Demo3 instance2 = new Demo3();
        public void run() {
            method();
        }
    
        public static synchronized  void method(){
            System.out.println("类锁,名称:"
                    +Thread.currentThread().getName()
            );
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "运行结束!");
        }
    
        public static void main(String[] args){
            Thread t1 = new Thread(instance1);
            Thread t2 = new Thread(instance2);
            t1.start();
            t2.start();
            while (t1.isAlive() || t2.isAlive()){}
            System.out.println("finished!");
        }
    }
    运行结果如下:

     *.class形式:

    /**
     * @Description: 类锁之二:synchronized(.*)形式
     */
    public class Demo4 implements Runnable {
        static Demo4 instance1 = new Demo4();
        static Demo4 instance2 = new Demo4();
        public void run() {
           method();
        }
    
        private void method(){
            synchronized (Demo4.class) {
                System.out.println("类锁,synchronized(.*)形式,名称:"
                        + Thread.currentThread().getName()
                );
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "运行结束!");
            }
        }
    
        public static void main(String[] args){
            Thread t1 = new Thread(instance1);
            Thread t2 = new Thread(instance2);
            t1.start();
            t2.start();
            while (t1.isAlive() || t2.isAlive()){}
            System.err.println("finished!");
        }
    }
    运行结果如下:
  • 相关阅读:
    阐述:SIP协议是什么
    【SIP协议】学习初学笔记
    【协议学习】SIP基本场景分析
    电话的前世今生
    深入浅出SIP协议
    QVariant类及QVariant与自定义数据类型转换的方法
    Qt中如何根据类名来实例化对象
    模板的全特化与偏特化
    为什么c++中,有时可以用类名直接访问非静态成员函数?
    C++引用详解
  • 原文地址:https://www.cnblogs.com/willpan-z/p/10677394.html
Copyright © 2011-2022 走看看