首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java编程之伪共享与缓存填充

缓存系统中是以缓存(cache line)为单位存储,缓存是2的整数幂个连续字节,一般为32-256个字节,最常见的缓存大小是64个字节。...下面是CPU缓存的逻辑图: CPU从主内存中加载数据的时候,不是只加载某一个变量的值,而是加载一个缓存的值,例如一个Java的long类型是8字节,因此在一个缓存中可以存8个long类型的变量。...Java处理缓存伪共享-缓存填充 因为是硬件底层的逻辑,几乎所有程序在跑的时候都会遇到这个问题,那么java是如何处理这个问题呢?答案就是缓存填充。   ...java培训 Java程序代码验证 官方也给了一个java的测试demo,那么下面针对各种不同的情景,做一下实验看看,是不是有缓存伪共享这个问题,测试代码如下: 下面针对各个测试场景,做一下简单的描述...场景三有volatile关键字,但是没有进行缓存填充,耗时是有缓存填充的10几倍,这里就能看出缓存填充的效果在用到了内存屏障的时候还是很明显。

55630
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    伪共享和缓存填充,Java并发编程还能这么优化!

    作者:Binhua 原文:http://www.cnblogs.com/Binhua-Liu/p/5620339.html 前言 关于伪共享的文章已经很多了,对于多线程编程来说,特别是多线程处理列表和数组的时候...JAVA 6下的方案 解决伪共享的办法是使用缓存填充,使一个对象占用的内存大小刚好为64bytes或它的整数倍,这样就保证了一个缓存里不会有多个对象。...这样就避免了一个缓存中加载多个对象。但这个方法现在只能适应JAVA6 及以前的版本了。...因此,JAVA 7下做缓存填充更麻烦了,需要使用继承的办法来避免填充被优化掉,这篇文章http://ifeve.com/false-shareing-java-7-cn/里的例子我觉得不是很好,于是我自己做了一些优化...JAVA 8下的方案 在JAVA 8中,缓存填充终于被JAVA原生支持了。JAVA 8中添加了一个@Contended的注解,添加这个的注解,将会在自动进行缓存填充。

    91820

    编程不规范,同事两泪!”

    更甚者,在《流浪地球》形成刷屏之势之后,仿其而出的“代码千万行,注释第一编程不规范,同事两泪”在技术圈中开始盛传,由此可见对于所有的程序员来说这是多么痛苦的事情。...编程的世界非常地宽广,涉及重多领域,我们有很多选择。你可以选择使用函数式编程,还是使用面向对象编程?你可以选择做服务端还是客户端?那么,你心中已经有抉择了吗?...当然,也不要过多地书写注释,你不需要通过注释解释每一代码。最好用 1-2 注释,写清楚重要部分的概述或说明。 格式不一致 这个和第四点非常相近,格式不一致也会对可读性和生产效率带来巨大的影响。...给用户错误提示,并告诉它下一步怎么做。 时刻记住灭霸的话。 使用不当的数据类型/数据结构 在不同的语言中,数据类型要求不一样,强类型语言非常严格,而弱类型可以随意使用。...结语 编程七宗罪,让人不爽。我们需要避免出现。 这个仅仅是在编程中出现的常见错误。你很难看到,一个程序员,在他的程序中出现这些问题。但这也正如圣经中的七宗罪一样,不仅是这些问题。

    47020

    编程不规范,同事两泪!”

    编程的世界非常地宽广,涉及重多领域,我们有很多选择。你可以选择使用函数式编程,还是使用面向对象编程?你可以选择做服务端还是客户端?那么,你心中已经有抉择了吗?...当你的项目只有 10-20 代码,或者只是代码片段时,你可以使用这种方式进行命名,但是在大项目中,不要这么做。不合适的命名,对可读性和效率有致命的影响。 一个命名的简单规则:你变量的名称可以自解释。...当然,也不要过多地书写注释,你不需要通过注释解释每一代码。最好用 1-2 注释,写清楚重要部分的概述或说明。 格式不一致 这个和第四点非常相近,格式不一致也会对可读性和生产效率带来巨大的影响。...给用户错误提示,并告诉它下一步怎么做。 时刻记住灭霸的话。 使用不当的数据类型/数据结构 在不同的语言中,数据类型要求不一样,强类型语言非常严格,而弱类型可以随意使用。...结语 编程七宗罪,让人不爽。我们需要避免出现。 这个仅仅是在编程中出现的常见错误。你很难看到,一个程序员,在他的程序中出现这些问题。但这也正如圣经中的七宗罪一样,不仅是这些问题。

    59130

    编程不规范,同事两泪!”

    编程不规范,同事两泪。...更甚者,在《流浪地球》形成刷屏之势之后,仿其而出的 “代码千万行,注释第一编程不规范,同事两泪” 在技术圈中开始盛传,由此可见对于所有的程序员来说这是多么痛苦的事情。...编程的世界非常地宽广,涉及重多领域,我们有很多选择。你可以选择使用函数式编程,还是使用面向对象编程?你可以选择做服务端还是客户端?那么,你心中已经有抉择了吗?...当然,也不要过多地书写注释,你不需要通过注释解释每一代码。最好用 1-2 注释,写清楚重要部分的概述或说明。 05....给用户错误提示,并告诉它下一步怎么做。 时刻记住灭霸的话。 07. 使用不当的数据类型 / 数据结构 在不同的语言中,数据类型要求不一样,强类型语言非常严格,而弱类型可以随意使用。

    62330

    编程不规范,同事两泪!”

    编程不规范,同事两泪。...更甚者,在《流浪地球》形成刷屏之势之后,仿其而出的 “代码千万行,注释第一编程不规范,同事两泪” 在技术圈中开始盛传,由此可见对于所有的程序员来说这是多么痛苦的事情。...编程的世界非常地宽广,涉及重多领域,我们有很多选择。你可以选择使用函数式编程,还是使用面向对象编程?你可以选择做服务端还是客户端?那么,你心中已经有抉择了吗?...当然,也不要过多地书写注释,你不需要通过注释解释每一代码。最好用 1-2 注释,写清楚重要部分的概述或说明。 05....给用户错误提示,并告诉它下一步怎么做。 时刻记住灭霸的话。 07. 使用不当的数据类型 / 数据结构 在不同的语言中,数据类型要求不一样,强类型语言非常严格,而弱类型可以随意使用。

    59160

    Java】网络编程

    专栏介绍 【Java】 目前主要更新Java,一起学习一起进步。...本期介绍 本期主要介绍网络编程 文章目录 第一章 网络编程入门 1.1软件结构 1.2 网络通信协议 1.3 协议分类 1.4 网络编程三要素 协议 IP地址 端口号 第二章 TCP通信程序 2.1 概述...网络编程,就是在一定的协议下,实现两台计算机的通信的程序。...它的内部包含一系列的用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫它的下一层所提供的协议来完成自己的需求。...在Java中,提供了两个类用于实现TCP通信程序: 客户端:java.net.Socket 类表示。创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信。

    75330

    Java异步编程

    Java异步编程 1、什么是java异步编程 Java异步编程是一种处理并发问题的技术,它可以在执行耗时操作的同时,不阻塞主线程,从而提高程序的性能和响应速度。...在传统的同步编程中,程序需要等待一个操作完成后才能继续执行下一个操作,这样可能会导致程序阻塞,降低程序的性能和响应速度。...4、异步编程的方式 Java异步编程的方式有以下几种: 回调函数:回调函数是一种基于接口的编程方式,可以在异步操作完成后调用回调函数来处理异步操作的结果。...RxJava:RxJava是一个基于响应式编程Java库,支持异步和并发编程,可以简化异步编程的复杂性。...Java异步编程可以使用多种方式来实现,每种方式都有其优点和适用场景,根据具体的业务需求选择合适的异步编程方式可以提高程序的性能和响应速度。

    72710

    Java编程基础

    Java编程基础 一、前言 什么是编程编程就是计算机程序告诉计算机应该做些什么,通过编程执行操作。 我们所学习到的Java编程语言是如今Internet上受欢迎的开发与编程语言。...JSE为标准版,主要用于桌面应用软件的编程,其余的以后另讲,如今小白学习的使用就是标准版。...2.java.applet包      java.applet包用来实现运行Java Applet的工具类库。 3.java.awt包     java.awt包是Java抽象窗口工具包。...4.java.io包      java.io包是Java语言的标准输入/输出类库。 5.java.net包     java.net包是Java网络包,主要实现网络功能。...知识准备 面向过程和面向对象 面向过程是以过程为中心的编程方法 面向对象是以对象为中心的编程方法 静态成员 静态成员用static关键字进行修饰,表示静态的意思,可以用来修饰成员变量和成员方法,也可以形成静态代码块

    69320

    Java并发编程

    Java中创建线程的三种方法以及区别 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。...Java可以用三种方式来创建线程,如下所示: 继承Thread类创建线程 实现Runnable接口创建线程 使用Callable和Future创建线程 线程池创建线程 下面让我们分别来看看这三种创建线程的方法...call()方法可以有返回值 call()方法可以声明抛出异常 Java5提供了Future接口来代表Callable接口里call()方法的返回值,并且为Future接口提供了一个实现类FutureTask...如果在Callable任务正常完成前被取消,返回True 介绍了相关的概念之后,创建并启动有返回值的线程的步骤如下: 创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8...但是编程稍微复杂,如果需要访问当前线程,必须调用Thread.currentThread()方法。 继承Thread类的线程类不能再继承其他父类(Java单继承决定)。

    1.1K60

    Java—网络编程

    1.网络编程的基本概念 1.1网络的概念 网络:一组相互连接的计算机,多台计算机组成,使用物理线路进行连接 1.2 网络连接的功能 1.3 网络编程的三要素 1)IP地址:唯一标识网络上的每一台计算机...用浏览器打开 右击检查源代码 8.3openStream() 方法 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream 8.4基于TCP协议的Socket编程...=null){ client.close(); } } } 先启动服务器端再启动客户机端 9.基于TCP协议的Socket编程_双向通信_实现模拟用户登录...基于TCP协议的Socket编程_聊天室_客户端多线程 10.1单次聊天的缺点 只能客户端现发送数据,然后才能接受数据,如果不发就收不到,(接收和发送是在一个线程中实现的)不符合实际情况。...// TODO Auto-generated catch block e.printStackTrace(); } } } } } 11.基于TCP协议的Socket编程

    2.3K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券