zoukankan      html  css  js  c++  java
  • java 多线程踩过的坑

    多线程踩坑记录:
    1、多线程切记不可以同时操作同一个原子数据。解释:存在一个条数据库A数据,不可以在2个或2个以上的线程中同时操作A数据。会引发重复操作。
    2、多线程操作方法不要加synchronized同步关键字,这失去了多线程的意义。解释:会是多线程按照同步线程执行。
    3、调用第三方接口时尽量不要使用多线程。解释:因为你不知道第三方接口是否针对高并发作了处理。如果第三方接口没有针对高并发作处理,自己写的多线程逻辑也没有处理好,会导致重复操作成功。后果很难处理。
    总结:
    作为一只菜鸟遇到过的问题。给自己提醒下。

    处理一批数据的多线程方法:
    使用同步线程获取批量数据,在逻辑上将这批数据分成不同部分,每一部分使用多线程处理。这样可以避免多个线程同时操作统一个数据。



    多线程的实例synchronized对比:

    线程执行方法:

    import threads.TaskRunnable;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ThreadsMain {
        public static void main(String[] args) {
            //创建线程池对象  参数5,代表有5个线程的线程池
            ExecutorService service = Executors.newFixedThreadPool(5);
            //创建Runnable线程任务对象
            TaskRunnable task = new TaskRunnable();
            //从线程池中获取线程对象
            service.submit(task);
            System.out.println("----------------------");
            //再获取一个线程对象
            service.submit(task);
            //关闭线程池
            service.shutdown();
        }
    }

    带有synchronized的执行方法:

    public class TaskRunnable implements Runnable{
        @Override
        public synchronized void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("自定义线程任务在执行"+i);
            }
        }
    }


    执行结果:

    ----------------------
    自定义线程任务在执行0
    自定义线程任务在执行1
    自定义线程任务在执行2
    自定义线程任务在执行3
    自定义线程任务在执行4
    自定义线程任务在执行5
    自定义线程任务在执行6
    自定义线程任务在执行7
    自定义线程任务在执行8
    自定义线程任务在执行9
    自定义线程任务在执行0
    自定义线程任务在执行1
    自定义线程任务在执行2
    自定义线程任务在执行3
    自定义线程任务在执行4
    自定义线程任务在执行5
    自定义线程任务在执行6
    自定义线程任务在执行7
    自定义线程任务在执行8
    自定义线程任务在执行9

    Process finished with exit code 0


    没有synchronized的执行方法:

    public class TaskRunnable implements Runnable{
        @Override
        public  void run() {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("自定义线程任务在执行"+i);
            }
        }
    }


    执行结果:

    ----------------------
    自定义线程任务在执行0
    自定义线程任务在执行0
    自定义线程任务在执行1
    自定义线程任务在执行1
    自定义线程任务在执行2
    自定义线程任务在执行2
    自定义线程任务在执行3
    自定义线程任务在执行3
    自定义线程任务在执行4
    自定义线程任务在执行4
    自定义线程任务在执行5
    自定义线程任务在执行5
    自定义线程任务在执行6
    自定义线程任务在执行6
    自定义线程任务在执行7
    自定义线程任务在执行7
    自定义线程任务在执行8
    自定义线程任务在执行8
    自定义线程任务在执行9
    自定义线程任务在执行9

    Process finished with exit code 0

    对比结论:

    加入synchronized执行结果会跟同步方法相似。就失去了多线程的意义

  • 相关阅读:
    为什么很多程序员都选择跳槽?
    程序员牛人跳槽
    批处理学习教程
    linux操作命令
    apache配置访问限制
    不常见使用的css
    input中的内容改变时触发的事件
    order by 特殊排序技巧
    CSS设置input placeholder文本的样式
    GoodUI:页面布局的技巧和设计理念
  • 原文地址:https://www.cnblogs.com/gynbk/p/10861077.html
Copyright © 2011-2022 走看看