zoukankan      html  css  js  c++  java
  • java基础---->多线程之synchronized(六)

      这里学习一下java多线程中的关于synchronized的用法。我来不及认真地年轻,待明白过来时,只能选择认真地老去。

    synchronized的简单实例

    一、 synchronized在方法上的使用

    public class SynchronizedTest {
        public static void main(String[] args) {
            MyThreadB threadB = new MyThreadB();
            new Thread(threadB, "T-1").start();
            new Thread(threadB, "T-2").start();
        }
    
        static class MyThreadB implements Runnable {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " before");
                printString();
                System.out.println(Thread.currentThread().getName() + " after");
            }
    
            private synchronized void printString() {
                for (int i = 0; i < 3; i++) {
                    try {
                        TimeUnit.SECONDS.sleep(i + 1);
                        System.out.println(Thread.currentThread().getName() + " , i = " + i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    运行的一次结果如下:

    T-1 before
    T-2 before
    T-1 , i = 0
    T-1 , i = 1
    T-1 , i = 2
    T-1 after
    T-2 , i = 0
    T-2 , i = 1
    T-2 , i = 2
    T-2 after

     如果去掉synchronized之后,一次的打印结果如下:

    T-1 before
    T-2 before
    T-1 , i = 0
    T-2 , i = 0
    T-1 , i = 1
    T-2 , i = 1
    T-1 , i = 2
    T-1 after
    T-2 , i = 2
    T-2 after

    二、synchronized代码块的使用

    public class SynchronizedTest {
        public static void main(String[] args) {
            MyThreadA threadA = new MyThreadA();
            new Thread(threadA, "T-1").start();
            new Thread(threadA, "T-2").start();
        }
    
        static class MyThreadA implements Runnable {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " outside of synchronized.");
                synchronized (this) {
                    for (int i = 0; i < 3; i++) {
                        try {
                            TimeUnit.SECONDS.sleep(i + 1);
                            System.out.println(Thread.currentThread().getName() + " , i = " + i);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

    一次的运行结果如下:

    T-2 outside of synchronized.
    T-1 outside of synchronized.
    T-2 , i = 0
    T-2 , i = 1
    T-2 , i = 2
    T-1 , i = 0
    T-1 , i = 1
    T-1 , i = 2

    如果去掉synchronized之后,一次的打印结果如下:

    T-1 outside of synchronized.
    T-2 outside of synchronized.
    T-2 , i = 0
    T-1 , i = 0
    T-2 , i = 1
    T-1 , i = 1
    T-1 , i = 2
    T-2 , i = 2

    友情链接

  • 相关阅读:
    ASP.NET中FileUpload中的代码怎么编写?
    JQuery EasyUI 根据数据动态生成datagrid,统计常用
    JQuery EasyUI window 用法
    jQuery EasyUI DataGrid 分页 FOR ASP.NET
    SQL server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法
    javascript 判断浏览器客户端
    Access, SQL Server, and Oracle数据类型的对应关系
    asp.net中的模态对话框
    [转]C++获取Windows时间的方法总结
    [转]Oracle开发与使用文章收藏
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavathreadsynchronized.html
Copyright © 2011-2022 走看看