• 共享内存的情况下,出现的高并发异常


    package thread;
    
    public class TestShareMemory {
    
        
        static String shareM = "";
        static void alter(String tmp){
            shareM = tmp;
        }
        
        static class GThread extends Thread {
               public void run() {
                    for (int i = 1; i < 2222122; i++){
                        alter("GThread");
                        if("XThread".equals(shareM)){
                        System.out.println("GThread:"+shareM);}
                    }
                    
                }
         }
         
         static class XThread extends Thread {
               public void run() {
                    for (int i = 1; i < 2221222; i++){
                        alter("XThread");
                        if("GThread".equals(shareM)){
                        System.out.println("XThread:"+shareM);}
                    }
                    
                }
         }
         
        public static void main(String[] args) {
    
            Thread p2 = new XThread();
            Thread p1 = new GThread();
             p1.start();
             p2.start();   
        }
    
    }

    普通情况下,是不会出现“GThread:XThread” 这种情况的,但是在上述高并发,并且共享内存的情况下就可能出现问题!

    可以通过这样加锁:

    package thread;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class TestShareMemory {
    
        private static Lock lock = new ReentrantLock();
        static String shareM = "";
    
        static void alter(String tmp) {
            shareM = tmp;
        }
    
        static class GThread extends Thread {
            public void run() {
                for (int i = 1; i < 2222122; i++) {
                    lock.lock();// 显示加锁
                    try {
                        alter("GThread");
                        if ("XThread".equals(shareM)) {
                            System.out.println("GThread:" + shareM);
                        }
                    } finally {
                        // 显示释放锁
                        lock.unlock();
                    }
    
                }
    
            }
        }
    
        static class XThread extends Thread {
            public void run() {
                for (int i = 1; i < 2221222; i++) {
                    lock.lock();// 显示加锁
                    try {
                        alter("XThread");
                        if ("GThread".equals(shareM)) {
                            System.out.println("XThread:" + shareM);
                        }
                    } finally {
                        // 显示释放锁
                        lock.unlock();
                    }
                }
    
            }
        }
    
        public static void main(String[] args) {
    
            Thread p2 = new XThread();
            Thread p1 = new GThread();
            p1.start();
            p2.start();
        }
    
    }

    总结:在高并发并且有共享内存的情况下,有几个方法解决并发问题:

    1、把共享内存的变量变成线程内部的变量。(有时候是没必要线程共享变量)。

    2、在必要线程共享变量的时候,对涉及到的读写共享变量的地方加锁。

  • 相关阅读:
    如果男人是计算机,女人是软件(在开发过程中的偶然随想)
    C/C++ 可变参数函数的原理和应用
    Python学习记录Hello Word
    Unity 把数字,英文图片变成字体
    unity+Android+PC加载本地图片
    Python学习记录安装
    Android学习 问题与答案
    Android 第三方 APK 包的静默安装
    Android学习 问题与答案 (2)
    JNI 之 HelloWorld
  • 原文地址:https://www.cnblogs.com/huhuuu/p/5558949.html
Copyright © 2020-2023  润新知