• 七、多线程基础-同步代码块与非同步代码块


    1)当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程则无法该object的另外一个synchronized(this)同步代码块。

    public class Thread1 {
        public void m4t1() {
            synchronized (this) {
                int i = 5;
                while (i-- > 0) {
                    System.out
                            .println(Thread.currentThread().getName() + " : " + i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        }
    
        public void m4t2() {
            synchronized (this) {
                int i = 5;
                while (i-- > 0) {
                    System.out
                            .println(Thread.currentThread().getName() + " : " + i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            final Thread1 myt2 = new Thread1();
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    myt2.m4t1();
                }
            }, "t1");
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    myt2.m4t2();
                }
            }, "t2");
            t1.start();
            t2.start();
        }
    }
    View Code

    2)当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

    public class Thread2 {
        public void m4t1() {
            synchronized (this) {
                int i = 5;
                while (i-- > 0) {
                    System.out
                            .println(Thread.currentThread().getName() + " : " + i);
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        }
    
        public void m4t2() {
            int i = 5;
            while (i-- > 0) {
                System.out.println(Thread.currentThread().getName() + " : " + i);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ie) {
                }
            }
        }
    
        public static void main(String[] args) {
            final Thread2 myt2 = new Thread2();
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    myt2.m4t1();
                }
            }, "t1");
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    myt2.m4t2();
                }
            }, "t2");
            t1.start();
            t2.start();
        }
    }
    View Code

    3)以上规则对其它对象锁同样适用:尽管线程t1获得了对Inner的对象锁,但由于线程t2访问的是同一个Inner中的非同步部分。所以两个线程互不干扰。

    public class Thread3 {
        class Inner {
            private void m4t1() {
                int i = 5;
                while (i-- > 0) {
                    System.out.println(Thread.currentThread().getName()
                            + " : Inner.m4t1()=" + i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ie) {
                    }
                }
            }
    
            private void m4t2() {
                int i = 5;
                while (i-- > 0) {
                    System.out.println(Thread.currentThread().getName()
                            + " : Inner.m4t2()=" + i);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException ie) {
                    }
                }
            }
        }
    
        private void m4t1(Inner inner) {
            synchronized (inner) { // 使用对象锁
                inner.m4t1();
            }
        }
    
        private void m4t2(Inner inner) {
            inner.m4t2();
        }
    
        public static void main(String[] args) {
            final Thread3 myt3 = new Thread3();
            final Inner inner = myt3.new Inner();
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    myt3.m4t1(inner);
                }
            }, "t1");
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    myt3.m4t2(inner);
                }
            }, "t2");
            t1.start();
            t2.start();
        }
    }
    View Code
    细水长流,打磨濡染,渐趋极致,才是一个人最好的状态。
  • 相关阅读:
    Spring源码阅读BeanFactory体系结构分析 coder
    Spring源码阅读IoC容器解析 coder
    Spring源码阅读ApplicationContext体系结构分析 coder
    【学习笔记】卷积神经网络 coder
    Spring源码阅读环境搭建 coder
    【学习笔记】分布式Tensorflow coder
    【spring实战第五版遇到的坑】3.1中的例子报错 coder
    阿里云服务器磁盘空间不足解决办法
    Tomcat配置https SSL证书
    mybatis:Creating a new SqlSession Closing non transactional SqlSession
  • 原文地址:https://www.cnblogs.com/jiarui-zjb/p/9622502.html
Copyright © 2020-2023  润新知