Java Synchronzied

作者: 韭菜待收割 | 来源:发表于2018-09-25 16:27 被阅读13次

    Synchronzied关键字的作用是线程同步,它可以用来修饰对象中的方法,将对象加锁。

    1、Synchronzied的几个分类

    1)非静态方法的同步

    //每个对象各持有一把锁
    
    //懒,就写一起了
    public class MainTest {
        //测试方法
        public static void main(String[] args) throws Exception {
            MainTest mainTest = new MainTest();
    
            //mainTest.synchronizedTest1();
            mainTest.synchronizedTest2();
        }
    
        public void synchronizedTest2() {
            //2、2个对象  每个对象各持有一把锁
            Test test = new Test();
    
            Test test2 = new Test();
            MyRunale myRunale2 = new MyRunale(test2, 2);
            Thread thread2 = new Thread(myRunale2);
            thread2.start();
    
            test.test1();
            //会打印2条记录
        }
    
        public void synchronizedTest1() {
            //1、同一个对象  只持有一把锁
            //只持有一把锁
            Test test = new Test();
            MyRunale myRunale2 = new MyRunale(test, 2);
            Thread thread2 = new Thread(myRunale2);
            thread2.start();
            test.test1();
            //只会打印1条记录
        }
    
        public class MyRunale implements Runnable {
            private Test test;
            private int type;
    
            public MyRunale(Test test, int type) {
                this.test = test;
                this.type = type;
            }
    
            @Override
            public void run() {
                if (type == 1) {
                    test.test1();
                } else {
                    test.test2();
                }
    
            }
        }
    
        public class Test {
            public synchronized void test1() {
                System.out.println("我是test1");
                try {
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            public synchronized void test2() {
                System.out.println("我是test2");
                try {
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    2)静态方法的同步

    //所有静态方法的锁也只有一个
    //静态方法的锁和 非静态方法的锁是不一样的
    
    //懒,就写一起了
    public class MainTest {
        //测试方法
        public static void main(String[] args) throws Exception {
            MainTest mainTest = new MainTest();
    
            //mainTest.synchronizedTest1();
            mainTest.synchronizedTest2();
        }
    
        public void synchronizedTest2() {
            //静态方法的锁和 非静态方法的锁是不一样的
            System.out.println("-------------synchronizedTest2开始-------------");
            Test test = new Test();
    
            MyRunale myRunale2 = new MyRunale(test, 1);
            Thread thread2 = new Thread(myRunale2);
            thread2.start();
    
            test.test0();
            System.out.println("-------------synchronizedTest2结束-------------");
            //会打印2条记录
        }
    
        public void synchronizedTest1() {
            //所有静态方法的锁也只有一个
            System.out.println("-------------synchronizedTest1开始-------------");
            Test test = new Test();
    
            Test test2 = new Test();
            MyRunale myRunale2 = new MyRunale(test2, 0);
            Thread thread2 = new Thread(myRunale2);
            thread2.start();
    
            test.test0();
            System.out.println("-------------synchronizedTest1结束-------------");
            //会打印1条记录
        }
    
        public class MyRunale implements Runnable {
            private Test test;
            private int type;
    
            public MyRunale(Test test, int type) {
                this.test = test;
                this.type = type;
            }
    
            @Override
            public void run() {
                if (type == 1) {
                    test.test1();
                } else if (type == 2) {
                    test.test2();
                } else if (type == 0) {
                    test.test00();
                }
            }
        }
    }
    
    public class Test {
        public static synchronized void test00() {
            System.out.println("我是test00");
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static synchronized void test0() {
            System.out.println("我是test0");
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public synchronized void test1() {
            System.out.println("我是test1");
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public synchronized void test2() {
            System.out.println("我是test2");
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    

    3)类的同步

    //同步块中的锁只有一个,即使是多个对象也只有一个
    public void method() { 
      synchronized(SomeClass.class) { 
       
      } 
    } 
    //懒,就写一起了
    public class MainTest {
        //测试方法
        public static void main(String[] args) throws Exception {
            MainTest mainTest = new MainTest();
    
            mainTest.synchronizedTest1();
        }
    
        public void synchronizedTest1() {
            Test test2 = new Test();
            MyRunale myRunale2 = new MyRunale(test2, 2);
            Thread thread2 = new Thread(myRunale2);
            thread2.start();
    
            Test test = new Test();
            test.test1();
    //        -----test1开始-----
    //        -----test1执行中-----
    //        -----test2开始-----
        }
    
        public class MyRunale implements Runnable {
            private Test test;
            private int type;
    
            public MyRunale(Test test, int type) {
                this.test = test;
                this.type = type;
            }
    
            @Override
            public void run() {
                if (type == 1) {
                    test.test1();
                } else {
                    test.test2();
                }
    
            }
        }
    }
    
    public class Test {
    
        public void test1() {
            System.out.println("-----test1开始-----");
            synchronized(Test.class){
                try {
                    System.out.println("-----test1执行中-----");
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("-----test1结束-----");
        }
    
        public void test2() {
            System.out.println("-----test2开始-----");
            synchronized(Test.class){
                try {
                    System.out.println("-----test2执行中-----");
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("-----test2结束-----");
        }
    } 
    

    4)公共对象的同步

    //没有static则每个test对象对于lock对象都有不同的锁
    private static Object lock=new Object();
    public void method() { 
      synchronized(lock) { 
       
      } 
    } 
    
    //懒,就写一起了
    public class MainTest {
        //测试方法
        public static void main(String[] args) throws Exception {
            MainTest mainTest = new MainTest();
    
            mainTest.synchronizedTest1();
        }
    
        public void synchronizedTest1() {
            Test test2 = new Test();
            MyRunale myRunale2 = new MyRunale(test2, 2);
            Thread thread2 = new Thread(myRunale2);
            thread2.start();
    
            Test test = new Test();
            test.test1();
    //        -----test1开始-----
    //        -----test1执行中-----
    //        -----test2开始-----
        }
    
        public class MyRunale implements Runnable {
            private Test test;
            private int type;
    
            public MyRunale(Test test, int type) {
                this.test = test;
                this.type = type;
            }
    
            @Override
            public void run() {
                if (type == 1) {
                    test.test1();
                } else {
                    test.test2();
                }
    
            }
        }
    }
    
    public class Test {
        //没有static则每个test对象对于lock对象都有不同的锁
        private static Object lock = new Object();
    
        public void test1() {
            System.out.println("-----test1开始-----");
            synchronized (lock) {
                try {
                    System.out.println("-----test1执行中-----");
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("-----test1结束-----");
        }
    
        public void test2() {
            System.out.println("-----test2开始-----");
            synchronized (lock) {
                try {
                    System.out.println("-----test2执行中-----");
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("-----test2结束-----");
        }
    }
    

    相关文章

      网友评论

        本文标题:Java Synchronzied

        本文链接:https://www.haomeiwen.com/subject/ojyloftx.html