20、同步在内置内中的使用

版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/85210474

首先我们需要了解一下java中的内置内。

package com.demo4;

public class OuterClass {
    private String username;
    private String password;
    class InnerClass {
        private String age;
        private String job;

        public String getAge() {
            return age;
        }

        public void setAge(String age) {
            this.age = age;
        }

        public String getJob() {
            return job;
        }

        public void setJob(String job) {
            this.job = job;
        }

        public void print(){
            System.out.println("username=" + username + " password=" + password);
        }
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
package com.demo4;

public class Run {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        outerClass.setUsername("jack");
        outerClass.setPassword("123456");
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.print();
    }
}

运行结果:

username=jack password=123456

内置内同步的使用

package com.demo4;

public class OuterClass {
    static class InnerClass {
        public void methodA() {
            try {
                synchronized (new Object()) {
                    for (int i = 0; i < 10; i++) {
                        System.out.println("执行methodA线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                        Thread.sleep(3000);
                    }
               }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public synchronized void methodB() {
            try {
                for (int i = 10; i < 20; i++) {
                    System.out.println("执行methodB线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.demo4;

public class Run {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                innerClass.methodA();
            }
        },"A");
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                innerClass.methodB();
            }
        },"B");
        threadA.start();
        threadB.start();
    }

}

运行结果:

执行methodA线程名:A ; i=0
执行methodB线程名:B ; i=10
执行methodB线程名:B ; i=11
执行methodB线程名:B ; i=12
执行methodB线程名:B ; i=13
执行methodA线程名:A ; i=1
执行methodB线程名:B ; i=14
执行methodB线程名:B ; i=15
执行methodB线程名:B ; i=16
执行methodA线程名:A ; i=2
执行methodB线程名:B ; i=17
执行methodB线程名:B ; i=18
执行methodB线程名:B ; i=19
执行methodA线程名:A ; i=3
执行methodA线程名:A ; i=4
执行methodA线程名:A ; i=5
执行methodA线程名:A ; i=6
执行methodA线程名:A ; i=7
执行methodA线程名:A ; i=8
执行methodA线程名:A ; i=9

由打印结果可知,由于A、B线程拿到的是不同的锁,所以执行起来是异步调用。如果想A、B同步执行的话,只需要将methodA同步。

package com.demo4;

public class OuterClass {
    static class InnerClass {
        public synchronized void methodA() {
            try {
                //synchronized (new Object()) {
                    for (int i = 0; i < 10; i++) {
                        System.out.println("执行methodA线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                        Thread.sleep(3000);
                    }
               //}
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public synchronized void methodB() {
            try {
                for (int i = 10; i < 20; i++) {
                    System.out.println("执行methodB线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

运行结果:

执行methodA线程名:A ; i=0
执行methodA线程名:A ; i=1
执行methodA线程名:A ; i=2
执行methodA线程名:A ; i=3
执行methodA线程名:A ; i=4
执行methodA线程名:A ; i=5
执行methodA线程名:A ; i=6
执行methodA线程名:A ; i=7
执行methodA线程名:A ; i=8
执行methodA线程名:A ; i=9
执行methodB线程名:B ; i=10
执行methodB线程名:B ; i=11
执行methodB线程名:B ; i=12
执行methodB线程名:B ; i=13
执行methodB线程名:B ; i=14
执行methodB线程名:B ; i=15
执行methodB线程名:B ; i=16
执行methodB线程名:B ; i=17
执行methodB线程名:B ; i=18
执行methodB线程名:B ; i=19

多个内置内 异步执行

package com.demo4;

public class OuterClass {
    static class InnerClass {
        public synchronized void methodA() {
            try {
                for (int i = 0; i < 10; i++) {
                    System.out.println("执行InnerClass中methodA线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                    Thread.sleep(2000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    static class InnerClass2 {
        public synchronized void methodB() {
            try {
                for (int i = 10; i < 20; i++) {
                    System.out.println("执行InnerClass2中methodB线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.demo4;

public class Run {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        OuterClass.InnerClass2 innerClass2 = new OuterClass.InnerClass2();
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                innerClass.methodA();
            }
        },"A");
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                innerClass2.methodB();
            }
        },"B");
        threadA.start();
        threadB.start();
    }

}

运行结果:

执行InnerClass2中methodB线程名:B ; i=10
执行InnerClass中methodA线程名:A ; i=0
执行InnerClass2中methodB线程名:B ; i=11
执行InnerClass2中methodB线程名:B ; i=12
执行InnerClass中methodA线程名:A ; i=1
执行InnerClass2中methodB线程名:B ; i=13
执行InnerClass2中methodB线程名:B ; i=14
执行InnerClass中methodA线程名:A ; i=2
执行InnerClass2中methodB线程名:B ; i=15
执行InnerClass中methodA线程名:A ; i=3
执行InnerClass2中methodB线程名:B ; i=16
执行InnerClass2中methodB线程名:B ; i=17
执行InnerClass中methodA线程名:A ; i=4
执行InnerClass2中methodB线程名:B ; i=18
执行InnerClass2中methodB线程名:B ; i=19
执行InnerClass中methodA线程名:A ; i=5
执行InnerClass中methodA线程名:A ; i=6
执行InnerClass中methodA线程名:A ; i=7
执行InnerClass中methodA线程名:A ; i=8
执行InnerClass中methodA线程名:A ; i=9

多个内置内之间的同步执行

package com.demo4;

public class OuterClass {
    static class InnerClass {
        public void methodA(InnerClass2 innerClass2) {
            synchronized (innerClass2) {
                try {
                    for (int i = 0; i < 10; i++) {
                        System.out.println("执行InnerClass中methodA线程名:" + Thread.currentThread().getName()
                                + " ; i=" + i);
                        Thread.sleep(2000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    static class InnerClass2 {
        public synchronized void methodB() {
            try {
                for (int i = 10; i < 20; i++) {
                    System.out.println("执行InnerClass2中methodB线程名:" + Thread.currentThread().getName()
                            + " ; i=" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.demo4;

public class Run {
    public static void main(String[] args) {
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        OuterClass.InnerClass2 innerClass2 = new OuterClass.InnerClass2();
        Thread threadA = new Thread(new Runnable() {
            @Override
            public void run() {
                innerClass.methodA(innerClass2);
            }
        },"A");
        Thread threadB = new Thread(new Runnable() {
            @Override
            public void run() {
                innerClass2.methodB();
            }
        },"B");
        threadA.start();
        threadB.start();
    }

}

运行结果:

执行InnerClass中methodA线程名:A ; i=0
执行InnerClass中methodA线程名:A ; i=1
执行InnerClass中methodA线程名:A ; i=2
执行InnerClass中methodA线程名:A ; i=3
执行InnerClass中methodA线程名:A ; i=4
执行InnerClass中methodA线程名:A ; i=5
执行InnerClass中methodA线程名:A ; i=6
执行InnerClass中methodA线程名:A ; i=7
执行InnerClass中methodA线程名:A ; i=8
执行InnerClass中methodA线程名:A ; i=9
执行InnerClass2中methodB线程名:B ; i=10
执行InnerClass2中methodB线程名:B ; i=11
执行InnerClass2中methodB线程名:B ; i=12
执行InnerClass2中methodB线程名:B ; i=13
执行InnerClass2中methodB线程名:B ; i=14
执行InnerClass2中methodB线程名:B ; i=15
执行InnerClass2中methodB线程名:B ; i=16
执行InnerClass2中methodB线程名:B ; i=17
执行InnerClass2中methodB线程名:B ; i=18
执行InnerClass2中methodB线程名:B ; i=19

猜你喜欢

转载自blog.csdn.net/toyota_rav4/article/details/85210474