zoukankan      html  css  js  c++  java
  • java的同步方法和同步代码块,对象锁,类锁区别

    /**
     * @author admin
     * @date 2018/1/12 9:48
     * 作用在同一个实例对象上讨论
     * synchronized同步方法的测试
     * 两个线程,一个线程调用synchronized修饰方法,另一个线程可以调用非synchronized修饰的方法,互不影响
     */
    public class SynchronizedTest {
    
        public synchronized void methodA() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodA-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public void methodB() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodB-" + i );
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
            SynchronizedTest test = new SynchronizedTest();
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test.methodA();
                }
            });
            thread1.start();
    
            Thread thread2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test.methodB();
                }
            });
            thread2.start();
        }
    }
    
    运行结果:
    methodA-0
    methodB-0
    methodA-1
    methodB-1
    methodB-2
    methodA-2
    methodA-3
    methodB-3
    methodA-4
    methodB-4
    
    /**
     * @author admin
     * @date 2018/1/12 10:16
     * 作用在同一个实例对象上讨论
     * Sychronized代码块的测试
     * 两个线程,一个线程执行synchronized代码块,另一个线程执行非synchronized代码块
     */
    public class SychronizedTest2 {
        public void methodA() {
            synchronized (this) {
                try {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("methodA-" + i);
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    
        public void methodB() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodB-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            SychronizedTest2 test2 = new SychronizedTest2();
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                   test2.methodA();
                }
            });
            thread1.start();
    
            Thread thread2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test2.methodB();
                }
            });
            thread2.start();
        }
    }
    
    运行结果:
    methodA-0
    methodB-0
    methodA-1
    methodB-1
    methodA-2
    methodB-2
    methodB-3
    methodA-3
    methodA-4
    methodB-4
    
    /**
     * @author admin
     * @date 2018/1/12 10:33
     * 作用在同一个实例对象上讨论
     * Synchronized同步方法和同步代码块
     * 1、synchronized和synchronized(this)二者没区别,都作用在this对象锁上面,所以会同步
     * 2、synchronized(obj),这个是作用在obj对象锁上面,和this对象锁不同,所以不会同步
     */
    public class SynchronizedTest3 {
        public synchronized void methodA() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodA-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public void methodB() {
            synchronized (this) {
                try {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("methodB-" + i);
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public void methodC() {
            Object obj = new Object();
            synchronized (obj) {
                try {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("methodC-" + i);
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            SynchronizedTest3 test3 = new SynchronizedTest3();
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test3.methodA();
                }
            });
            thread1.start();
    
            Thread thread2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test3.methodB();
                }
            });
            thread2.start();
    
            Thread thread3 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test3.methodC();
                }
            });
            thread3.start();
    
        }
    }
    
    运行结果:
    methodA-0
    methodC-0
    methodA-1
    methodC-1
    methodA-2
    methodC-2
    methodA-3
    methodC-3
    methodA-4
    methodC-4
    methodB-0
    methodB-1
    methodB-2
    methodB-3
    methodB-4
    
    /**
     * @author admin
     * @date 2018/1/12 10:48
     * 作用在同一个类上讨论,每一个类只有一个类锁
     * synchronized类锁
     * static synchronized 和 synchronized(SynchronizedTest4.class),都是作用在同一个类锁上,所以会同步
     */
    public class SynchronizedTest4 {
        public synchronized static void methodA() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodA-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public void methodB() {
            synchronized (SynchronizedTest4.class) {
                try {
                    for (int i = 0; i < 5; i++) {
                        System.out.println("methodB-" + i);
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            SynchronizedTest4 test4 = new SynchronizedTest4();
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test4.methodA();
                }
            });
            thread1.start();
    
            Thread thread2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test4.methodB();
                }
            });
            thread2.start();
        }
    }
    
    运行结果:
    methodA-0
    methodA-1
    methodA-2
    methodA-3
    methodA-4
    methodB-0
    methodB-1
    methodB-2
    methodB-3
    methodB-4
    
    /**
     * @author admin
     * @date 2018/1/12 11:03
     * synchronized的对象锁和static synchronized的类锁,是两个不同的锁,所以不会同步
     * 两个线程,一个调用对象锁,一个调用类锁
     */
    public class SynchronizedTest5 {
        public synchronized  void methodA() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodA-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public synchronized static void methodB() {
            try {
                for (int i = 0; i < 5; i++) {
                    System.out.println("methodB-" + i);
                    Thread.sleep(1000);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) {
            SynchronizedTest5 test5 = new SynchronizedTest5();
            Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test5.methodA();
                }
            });
            thread1.start();
    
            Thread thread2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    test5.methodB();
                }
            });
            thread2.start();
        }
    }
    
    运行结果:
    methodA-0
    methodB-0
    methodA-1
    methodB-1
    methodB-2
    methodA-2
    methodB-3
    methodA-3
    methodB-4
    methodA-4
    
  • 相关阅读:
    CSS---@import
    C语言中float,double类型,在内存中的结构(存储方式)
    科普:字,字长,字节,位
    mysql的字段类型范围必须重视起来
    print,print_r,echo,var_dump,var_export比较
    常见编码格式
    php截取字符串,无乱码
    MYSQL配置详解
    Mysql主从复制,读写分离
    17173php招聘
  • 原文地址:https://www.cnblogs.com/xubiao/p/8274863.html
Copyright © 2011-2022 走看看