zoukankan      html  css  js  c++  java
  • synchronized

    针对线程的安全问题,可以使用synchronized解决:

    public class Outputter {
    
        //方法1,用synchronized修饰代码块
        // 这个方法锁住的是多线程之间共享的对象
        /*public void output(String str){
            synchronized (this){
                for(int  i = 0; i < str.length();i++){
                    System.out.print(str.charAt(i));
                }
            }
        }*/
    
        //方法2,用synchronized修饰方法
        //这个方法是用synchronized锁住整个方法
        public synchronized void output(String str){
                for(int  i = 0; i < str.length();i++){
                    System.out.print(str.charAt(i));
                }
        }
        
        /**
         * 需要注意的是,synchronized会造成线程死锁
         */
        
    }
    public class TraditionalThreadSynchronized {
    
        public static void main(String[] args) {
            final Outputter outputter = new Outputter();
            new Thread("Thread1"){
                public void run(){
                    outputter.output("zhangsanlisi ");
                }
            }.start();
    
            new Thread("Thread2"){
                public void run(){
                    outputter.output("Chinaese ");
                }
            }.start();
    
            new Thread("Thread3"){
                public void run(){
                    outputter.output("American ");
                }
            }.start();
    
            new Thread("Thread4"){
                public void run(){
                    outputter.output("abcdefghijklmn ");
                }
            }.start();
    
            new Thread("Thread5"){
                public void run(){
                    outputter.output("abcdefghijklmn ");
                }
            }.start();
    
        }
    }

     synchronized讲解:

      每个锁被称为monitor,有两个队列:就绪队列,阻塞队列。

      就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程,当一个线程被唤醒notify后,就进入就绪队列,反之被wait后,就进入了阻塞队列。

      一个线程执行互斥代码的过程是:

      1. 获得同步锁

      2. 清空工作内存

      3. 从主内存中拷贝对象副本到工作内存

      4. 执行代码

      5. 刷新主内存

      6. 释放同步锁

    所以,synchronized保证了线程的有序性和可见性。

  • 相关阅读:
    兼容性处理
    H5 IOS 虚拟键盘不回落的问题
    git 的版本控制
    vue-devtools工具的安装
    linux下安装mysql
    Python安装pip3常见问题
    linux下安装python3
    接口_注册接口
    接口_简单get接口_第一个接口
    Python学习笔记_Redis
  • 原文地址:https://www.cnblogs.com/lfdingye/p/7443208.html
Copyright © 2011-2022 走看看