文档章节

多线程编程注意点(持续更新)

SimonAt
 SimonAt
发布于 07/13 10:50
字数 274
阅读 9
收藏 0

1. 对象逸出(Escape)

    构造函数中,当前对象还没初始化完成就暴露this给外部

package com.chstudy.unsafe;

import java.util.ArrayList;
import java.util.List;

public class EventEscape {

    private final List<Event> listOfEvents;

    public EventEscape(EventSource source) {
        source.registerListener(new EventListener() {
            @Override
            public void onEvent(Event e) {
                doSomething(e);
            }
        });
        listOfEvents = new ArrayList<>();
    }

    void doSomething(Event e) {
        listOfEvents.add(e);
    }

    interface Event {

    }

    interface EventSource {
        void registerListener(EventListener listener);

    }

    interface EventListener {
        void onEvent(Event event);
    }
}    

二、并发使用的类,对成员变量的访问需要同步

package com.chstudy.unsafe;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;


@WebServlet(urlPatterns = "/count.do")
public class UnsafeCountServlet  extends GenericServlet implements Servlet {


    private Long count = 0L;

    public Long getCount() {
        return count;
    }

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        count++;
        res.getWriter().write(count+"");
        res.flushBuffer();
    }

}

三、JVM 参数,打印指定方法的汇编指令

-XX:+UnlockDiagnosticVMOptions -Xcomp -XX:+PrintAssembly -XX:CompileCommand=compileonly,*GoalNotifier.setGoal

-XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly:开启JIT反汇编
-Xcomp:让虚拟机以编译模式执行代码,使得JIT编译可以立即触发 -XX:CompileCommand=compileonly,*GoalNotifier.setGoal:只反汇编GoalNotifier的setGoal方法

四、

本文转载自:https://legacy.gitbook.com/book/hzy38324/java-concurrency-in-practice/details

共有 人打赏支持
SimonAt
粉丝 5
博文 57
码字总数 11295
作品 0
苏州
程序员
私信 提问
如何跳出令人窒息的职场死循环

点击上方“程序人生”,选择“置顶公众号” 第一时间关注程序猿(媛)身边的故事 你的工作和生活,是这样的吗? 上班,领导派活,编码(可能是任务 X)、测试(可能是任务 Y)、解 Bug (可能...

csdnsevenn
01/03
0
0
一起学Python:线程-注意点

线程-注意点 1. 线程执行代码的封装 通过上一小节,能够看出,通过使用threading模块能完成多任务的程序开发,为了让每个线程的封装性更完美,所以使用threading模块时,往往会定义一个新的子...

祈澈姑娘
2017/11/28
0
0
电子书合集

电子书合集 那天午后2013-05-2835 阅读 C++游戏编程 点此下载 高质量C++编程 点此下载 Java语言程序设计-基础篇 点此下载 Java语言程序设计-高级篇 点此下载 大话java 点此下载 计算机网络 ...

那天午后
2013/05/28
0
0
maven集成命令-U -B -P -e

在持续集成服务器上使用怎样的 mvn 命令集成项目,这个问题乍一看答案很显然,不就是 mvn clean install 么?事实上比较好的集成命令会稍微复杂些,下面是一些总结: 不要忘了clean: clean能...

哲别0
2017/11/02
0
0
一起学Python:多线程-共享全局变量

多线程-共享全局变量 运行结果: 列表当做实参传递到线程中 运行结果: 总结: 在一个进程内的所有线程共享全局变量,很方便在多个线程间共享数据 缺点就是,线程是对全局变量随意遂改可能造成...

祈澈姑娘
2017/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

当S8遇上边缘计算:谈阿里云ENS对直播业务场景的支撑

摘要: 类似S8赛事这样的大型活动直播的特点和技术挑战是什么?为什么业务要下沉到边缘?自建边缘节点和与云服务厂商合作到底该如何选择?边缘节点服务(ENS)又是如何进行技术支撑?提供的针...

阿里云官方博客
4分钟前
1
0
supervisor安装配置

supervisor安装配置 安装 wget -c https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gztar -zxvf su......

jackmanwu
15分钟前
1
0
laravel定时器

民间高手: https://blog.csdn.net/zhezhebie/article/details/79205414 官方文档: https://laravel-china.org/docs/laravel/5.5/scheduling/1325...

vio小黑
38分钟前
0
0
Apache Zeppelin安装及使用

Apache Zeppelin官网:http://zeppelin.apache.org/ Apache Zeppelin介绍:A web-based notebook that enables interactive data analytics. You can make beautiful data-driven, interacti......

GordonNemo
39分钟前
4
0
关于python开发多个项目环境配置Anaconda

关于Anaconda用来管理Python的包和环境 下载并安装Anaconda 创建项目:windows键+R ==> 进入CMD => 输入conda create -n 项目名称 python=3 conda info -e 查看项目以及项目所在的位置,默认...

上官清偌
40分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部