• 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!");
        }
    }
    运行结果如下:
  • 相关阅读:
    百度面试题
    分治法--二分查找、乘方、斐波那契数
    01-11李宁老师学Python视频课程(1):初识Python返回课程
    邮件发送的两种实现方法。
    Docker(一):Docker入门教程
    安装docker及在docker中安装python环境学
    vim编辑器的使用和CentOS有很多不同
    大一编程基础培训]==02-03-04-05课==类型
    大一编程基础培训]==08课==条件判断]==07课==Python的LIST与TUPLE数据类型
    Beautiful Soup 4.2.0 文档¶ BeautifulSoup对象内任何第一个标签入口,使用find()方法。
  • 原文地址:https://www.cnblogs.com/willpan-z/p/10677394.html
Copyright © 2020-2023  润新知