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就是指当前类的实例对象,同一个实例对象通用一个锁,不同实例对象使用不用锁。

  • 相关阅读:
    About LabView
    Accuracy, Precision, Resolution & Sensitivity
    EIT: where is it now and what lies ahead?
    <2014 12 28> Some conclusions and thought recently
    <2014 10 01> 数学基础 Wikipedia
    关于HashMap
    elasticsearch index 之 put mapping
    elasticsearch index 之 create index(二)
    elasticsearch index 之 create index(-)
    elasticsearch index 之merge
  • 原文地址:https://www.cnblogs.com/yy3b2007com/p/8981369.html
Copyright © 2011-2022 走看看