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

    友情链接

  • 相关阅读:
    您上次已将进行的搜狗输入法的安装或卸载,操作要求重启。您在重启之后才能继续新的输入法安装卸载程序。
    CUDPP主页
    cudaMemcpy2D介绍
    cudaMallocPitch – 向GPU分配存储器
    leanote开源云笔记
    OpenMP常用函数
    PRmakefile文件
    安装gcc,g++
    Getting aCC Error :name followed by "::" must be a class or namespace name"
    acc_set_device_num && acc_get_device_num例程
  • 原文地址:https://www.cnblogs.com/huhx/p/baseusejavathreadsynchronized.html
Copyright © 2011-2022 走看看