zoukankan      html  css  js  c++  java
  • Java-JUC(十一):线程8锁

    题目:

    判断以下8种情况,输出的内容

    题目一:一个Number实例对象number,两个非静态同步方法getOne,getTwo,两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
                    number.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public synchronized void getOne(){
            System.out.println("one");
        }
        
        public synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    one
    two

    题目二:一个Number实例对象number,两个非静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
                    number.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    one
    two

    题目三:一个Number实例对象number,两个非静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),新增普通方法getThree方法,三个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo,一个线程调用number.getThree),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
                    number.getTwo();
                }
            }).start();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getThree();
                }
            }).start();
        }
    }
    
    class Number{
        public synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public synchronized void getTwo(){
            System.out.println("two");
        }
        public void getThree(){
            System.out.println("three");
        }
    }

    输出结果:

    three
    one
    two

    题目四:两个Number实例对象number,number2,两个非静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number2.getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            final Number number2=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
                    // number.getTwo();
                     number2.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    two
    one

    题目五:一个Number实例对象number,一个静态同步方法getOne,一个非静态同步方法getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
                     number.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public static synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    two
    one

    题目六:一个Number实例对象number,两个静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            //final Number number2=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
                    number.getTwo();
                    // number2.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public static synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public static synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    one
    two

    题目七:两个Number实例对象number,number2,一个静态同步方法getOne,一个非静态同步方法getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.2getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            final Number number2=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
    //                number.getTwo();
                    number2.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public static synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    two
    one

    题目八:两个Number实例对象number,number2,两个静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.2getTwo),判断输出

    package com.dx.juc.test;
    
    public class Thread8Monitor {
        public static void main(String[] args) {
            final Number number=new Number();
            final Number number2=new Number();
            
            new Thread(new Runnable() {
                public void run() {
                    number.getOne();
                }
            }).start();
    
            new Thread(new Runnable() {
                public void run() {
    //                number.getTwo();
                    number2.getTwo();
                }
            }).start();
        }
    }
    
    class Number{
        public static synchronized void getOne(){
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("one");
        }
        
        public static synchronized void getTwo(){
            System.out.println("two");
        }
    }

    输出结果:

    one
    two

    总结:

    1)静态方法锁是锁的Number.class(类的字节码,也是Class的实例);一个类中不管有多少个静态方法,不管访问它们的是多少个线程,这些线程都是公用同一个锁。

    2)非静态方法锁是锁的this,也就是当前实例对象。this就是指当前类的实例对象,同一个实例对象通用一个锁,不同实例对象使用不用锁。

  • 相关阅读:
    HTML5 API分享
    承接VR外包,虚拟现实外包,北京正规公司
    虚拟现实外包—动点飞扬软件专门承接VR/AR场景、游戏、项目外包
    Unity3d外包—就找北京动点软件(长年承接Unity3d软件、游戏项目外包)
    Kinect外包团队— 2016中国VR开发者论坛第一期
    Kinect外包-就找北京动点飞扬软件(长年承接微软Kinect体感项目外包,有大型Kinect案例)
    Win10外包公司(长年承接Win10App外包、Win10通用应用外包)
    HTML5外包注意事项-开发HTML5游戏的九大坑与解决方法剖析
    HTML5外包团队:HTML5 Canvas使用教程
    libgo 2.0发布
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/8981369.html
Copyright © 2011-2022 走看看