• Java深入学习13:synchronized在静态方法和非静态方法下的同步


    Java深入学习13:synchronized在静态方法和非静态方法下的同步

    先说结论:

      1-对于一个线程target内的多个非静态方法使用synchronized同步时,非静态方法锁互斥;且非静态方法的锁默认为this实例;即同一线程target实例内非静态方法锁互斥,不同线程target实例非静态方法锁相互不干扰。

      2-对于一个线程target内的多个静态方法使用synchronized同步时,静态方法锁互斥;且非静态方法的锁默认为对应的Class实例;即同一线程target实例内静态方法互斥,不同线程target实例静态方法也互斥。

      3-由1和2可知,静态方法和非静态方法之间相互不干扰

    验证结论:

      1-线程Target类内共四个方法:非静态同步方法A,非静态同步方法B,静态同步方法A,静态同步方法B;其中方法A内会线程沉睡1秒。

      2-按照如下顺序依次测试,结果如下。

       3-测试代码

    public class MyLockTest {
    
        public static void main(String[] args) {
    
            ThreadTarget tt1 = new ThreadTarget();//target实例1
            ThreadTarget tt2 = new ThreadTarget();//target实例2
            
            //线程1
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //tt1.getA();//序号1
                    //tt1.getA();//序号2
                    //tt1.getStaticA();//序号3
                    //tt1.getA();//序号4
                    //tt1.getA();//序号5
                    tt1.getStaticA();//序号6
                }
            }).start();
            //线程2
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //tt1.getB();//序号1
                    //tt1.getStaticB();//序号2
                    //tt1.getStaticB();//序号3
                    //tt2.getB();//序号4
                    //tt2.getStaticB();//序号5
                    tt2.getStaticB();//序号6
                }
            }).start();
        }
    }
    class ThreadTarget{
    
        //方法1:非静态同步A
        public synchronized void getA(){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("A");
        }
        //方法2:非静态同步B
        public synchronized void getB(){
            System.out.println("B");
        }
        //方法3:静态同步A
        public static synchronized void getStaticA(){
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("static A");
        }
        //方法4:静态同步B
        public static synchronized void getStaticB(){
            System.out.println("static B");
        }
    }
  • 相关阅读:
    行盒(line box)垂直方向的属性详解:从font-size、line-height到vertical-align
    CSS绝对定位的原点:是在border上、padding上还是在content上?
    从知乎首页用户操作入口学习到的CSS技巧
    重置表单中的文件上传控件(file input)的方法
    ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记
    Yarn的Linking dependencies特别慢的优化方法
    MongoDB学习记录(四)
    MongoDB学习记录(三)
    MongoDB学习记录(二)
    AdBlock——拦截网页广告
  • 原文地址:https://www.cnblogs.com/wobuchifanqie/p/12544609.html
Copyright © 2020-2023  润新知