精华内容
下载资源
问答
  • 我们知道并发编程离不开锁,以java为例,JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁...

    055ce3deba6dce18b3a6d3e90bfa8228.png

    我们知道并发编程离不开锁,以java为例,JVM内部实现了很多种锁机制,有偏向锁、轻量级锁和互斥锁。有意思的是除了偏向锁,JVM实现锁的方式都用了循环CAS,即当一个线程想进入同步块的时候使用循环CAS的方式来获取锁。CAS即比较并替换,由计算机底层支持的原子性操作。本文将深入的介绍CAS的原理。

    首先先讲一下在计算机内部是如何保证CAS的原子性的呢?

    我们先看一下计算机缓存结构:

    33877140d35087e38619aaf8177a5120.png

    每个核心有其独有的L1和L2级高速缓存和共有的L3级缓存。

    首先讲一下MESI协议:

    Modified(M): 表示这个cacheline已经被修改,但是还未写回主存(cache中数据与主存中数据不一致!所有其它core对这个cacheline的读操作必须在该cacheline 写回主存后, 写回主存后,状态变换到share

    Exclusive(E): 表示这个cacheline 目前是独有的且与主存一致,可以转换到shared 或者M,重点是可以转换到M,也就意味着可以对其修改!

    Shared(S):表示这个cacheline 在其它core的cache中也存在, 目前也与主存一致, 随时会被invalidate.

    Invalid(I): 表示这个cacheline 目前不可用

    7d1ac9497b6104b61733817e86c235bc.png

    一个处于M状态的缓存行,必须时刻监听所有试图读取该缓存行对应的主存地址的操作,如果监听到,则必须在此操作执行前把其缓存行中的数据写回CPU。

    一个处于S状态的缓存行,必须时刻监听使该缓存行无效或者独享该缓存行的请求,如果监听到,则必须把其缓存行状态设置为I。

    一个处于E状态的缓存行,必须时刻监听其他试图读取该缓存行对应的主存地址的操作,如果监听到,则必须把其缓存行状态设置为S。

    当CPU需要读取数据时,如果其缓存行的状态是I的,则需要从内存中读取,并把自己状态变成S,如果不是I,则可以直接读取缓存中的值,但在此之前,必须要等待其他CPU的监听结果,如其他CPU也有该数据的缓存且状态是M,则需要等待其把缓存更新到内存之后,再读取。

    当CPU需要写数据时,只有在其缓存行是M或者E的时候才能执行,否则需要发出特殊的RFO指令(Read Or Ownership,这是一种总线事务),通知其他CPU置缓存无效(I),这种情况下会性能开销是相对较大的。在写入完成后,修改其缓存状态为M。

    当两个核心使用CAS的方式对缓存行进行更改时,会向ring bus(在p6处理器之前,会采用锁总线的方式阻隔其它处理器访问内存,来达到原子性,在p6以后的X86处理器上,新加ring bus来传输每个核心对缓存行的修改,并通过MESI协议来达到原子性)发出invalidate这个操作。那么在ring bus上就会根据特定的设计协议仲裁是core0,还是core1能赢得这个invalidate,胜者完成操作, 失败者需要接受结果, invalidate自己对应的cacheline,再读取胜者修改后的值, 回到起点。对于我们的CAS操作来说, 其实锁并没有消失,只是转嫁到了ring bus的总线仲裁协议中. 而且大量的多核同时针对一个地址的CAS操作会引起反复的互相invalidate 同一cacheline, 造成pingpong效应, 同样会降低性能。

    在x86架构上,CAS被翻译为”lock cmpxchg...“,首先一点cmpxchg并不是原子的,cmpchg会被拆解为:读取、比较、交换三个过程,也就是说如果两个cpu同时读取同时比较同时交换的话,会有协议仲裁谁能够成功,对于另一个cpu来说,也就意味着过程被打断了。因此可以使用lock前缀来锁住缓存行或者总线,保证排他性,在做比较变换的时候是原子性的。

    那么可以说MESI是保证了可见性,但不保证原子性的(有待考究,不知道说的是否准确)

    我们把视角调高,在应用层面上看看MESI:

    volatile是java中的关键字,能够保证变量的可见性。有volatile变量修饰的共享变量进行写操作的时候会多出第二行汇编代码:

    0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);

    intel的手册对lock前缀的说明如下。

    1)确保对内存的读-改-写操作原子执行。在Pentium及Pentium之前的处理器中,带有lock前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。从Pentium 4、Intel Xeon及P6处理器开始,Intel使用缓存锁定(Cache Locking),刚才已经提到,来保证指令执行的原子性。缓存锁定将大大降低lock前缀指令的执行开销。

    2)禁止该指令与之前和之后的读和写指令重排序。

    3)把写缓冲区中的所有数据刷新到内存中(可见性),对应缓存航标为M

    而(3)(2)即内存屏障。

    因此lock关键字保证了可见性和原子性。

    展开全文
  • java的事件处理机制在...同样的也具有事件源,事件监听和事件响应,这种机制是为了更好的完成人机交互,这个东西也是在绘图防技术方面的重点,原理不是很难理解,难理解的就是事件处理的底层因素,对于这个,同样的...

    java的事件处理机制在我看开是应该建立在swing的基础之上的,因为在se阶段,java的事件处理就是监听图形界面的,我说的是一般,当然也有特殊,对于事件,对于我应该不会陌生,这个事件的意义和B/S开发里面的事件是相同的,同样的也具有事件源,事件监听和事件响应,这种机制是为了更好的完成人机交互,这个东西也是在绘图防技术方面的重点,原理不是很难理解,难理解的就是事件处理的底层因素,对于这个,同样的,还是应该先完成功能,然后做一些理解。下面是我在学习过程中的一些代码:

    package Test;

    import java.awt.*;

    import javax.swing.*;

    //import java.awt.event.*;

    import java.awt.event.ActionEvent;

    import java.awt.event.ActionListener;

    //时间处理机制用到的包

    import java.awt.event.*;public class shijian extends JFrame implements ActionListener{

    JPanel mp = null;

    JButton jb1=null;

    JButton jb2=null;

    public static void main(String[] args) {

    shijian p1=new shijian();

    }

    public shijian(){

    mp=new JPanel();

    jb1=new JButton("黑色");

    jb2=new JButton("红色");

    this.add(jb1,BorderLayout.NORTH);

    mp.setBackground(Color.BLACK);

    this.add(mp);

    this.add(jb2,BorderLayout.SOUTH);

    //注册一个监听

    jb1.addActionListener(this);

    jb2.addActionListener(this);

    jb1.setActionCommand("aa");

    jb2.setActionCommand("bb");

    this.setSize(200,150);

    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.setVisible(true);

    }

    @Override

    public void actionPerformed(ActionEvent e) {

    if(e.getActionCommand().equals("aa")){

    System.out.println("您点击了黑色");

    }else if(e.getActionCommand().equals("bb")){

    System.out.println("您点击了红色");

    }else {

    System.out.print("您点击了其它");

    }

    }

    }

    原文:http://blog.csdn.net/mycodedream/article/details/46573055

    展开全文
  • java的事件处理机制在我看...同样的也具有事件源,事件监听和事件响应,这种机制是为了更好的完成人机交互,这个东西也是在绘图防技术方面的重点,原理不是很难理解,难理解的就是事件处理的底层因素,对于这个,同样的

    java的事件处理机制在我看开是应该建立在swing的基础之上的,因为在se阶段,java的事件处理就是监听图形界面的,我说的是一般,当然也有特殊,对于事件,对于我应该不会陌生,这个事件的意义和B/S开发里面的事件是相同的,同样的也具有事件源,事件监听和事件响应,这种机制是为了更好的完成人机交互,这个东西也是在绘图防技术方面的重点,原理不是很难理解,难理解的就是事件处理的底层因素,对于这个,同样的,还是应该先完成功能,然后做一些理解。下面是我在学习过程中的一些代码:

    package Test;
    import java.awt.*;
    import javax.swing.*;
    //import java.awt.event.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    //时间处理机制用到的包
    import java.awt.event.*;
    public class shijian extends JFrame implements ActionListener{
    	JPanel mp = null;
    	JButton jb1=null;
    	JButton jb2=null;
    	public static void main(String[] args) {
    		shijian p1=new shijian();
    
    	}
    	public shijian(){
    		mp=new JPanel();
    		jb1=new JButton("黑色");
    		jb2=new JButton("红色");
    		
    		this.add(jb1,BorderLayout.NORTH);
    		mp.setBackground(Color.BLACK);
    		this.add(mp);
    		this.add(jb2,BorderLayout.SOUTH);
    		
    //		注册一个监听
    		jb1.addActionListener(this);
    		jb2.addActionListener(this);
    		jb1.setActionCommand("aa");
    		jb2.setActionCommand("bb");
    		this.setSize(200,150);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    	}
    	@Override
    	public void actionPerformed(ActionEvent e) {
    
    		if(e.getActionCommand().equals("aa")){
    			System.out.println("您点击了黑色");
    		}else if(e.getActionCommand().equals("bb")){
    			System.out.println("您点击了红色");
    		}else {
    			System.out.print("您点击了其它");
    		}
    		
    	}
    
    }
    



    展开全文
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  • java源码包4

    千次下载 热门讨论 2013-04-20 11:31:44
     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  • Java典型模块

    2012-02-25 18:27:40
    第23章 Applet事件监听项目 (事件处理机制) 23.1 Applet事件监听原理 23.1.1 项目结构框架分析 23.1.2 项目功能业务分析 23.2 Applet事件监听项目 23.2.1 事件监听的类 23.2.2 承载事件监听的页面 23.3 知识点扩展...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  •  基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  • 网络机制的实现是靠平台实现的,除非自己开发平台,否则是不需要知道socket怎么实现,怎么监听访问的。因此在这方面花太多的功夫就偏离了”将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平台”这一假设...

    Java号称是最强的网络编程语言,但是大多数应用程序开发人员是从来不会自己开发什么底层的网络程序的。

    需要做只是了解原理就够了。网络机制的实现是靠平台实现的,除非自己开发平台,否则是不需要知道socket怎么实现,怎么监听访问的。因此在这方面花太多的功夫就偏离了”将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平台”这一假设。

    Java程序员的门槛相对比较高

    首先要计算机技术或是相关专业的大学生,原因有二,一是,Java对从业人员素质有一点要求,计算机相关行业会了解最基本的互联网的相关知识,以及简单的语言基础;二是,从事这一行业,招聘公司对学历有要求,最起码要是专科以上的。

    当然,也不排除有非计算机专业的从事Java行业的人,但是万事开头难,很多人抱着很大的希望去学习,随着遇到的困难越来越多,慢慢的也就放弃了,因此有一部分人都倒在了入门的路上。所以干这一行的人相对其他行业还是少。

    Java行业市场需求存在巨大的缺口

    这几年中国在移动互联网这块发展非常迅猛,各种创业公司、小团队如雨后春笋般冒出来,对Java开发的需要变大。但存在人才发展跟不上市场的需求的现状,相对应的给优秀Java人才开出的薪资待遇随之水涨船高。

    程序员的确很辛苦,需要不断学习、进步

    辛苦分劳力和脑力两种,劳力工作不难,每天重复着体力活;但脑力活就不一样了,程序员一辈子都在学习、在挑战,因为这是一个不进步就out的行业。

    随着互联网的发展,很多企业随着业务发展要求服务器程序更稳定,更可靠。如:京东,淘宝等大型人网站均采用Java框架进行开发。银行券商等机构均采用Java作为开发语言。

    对于在职的Java从业人员来讲,不断的努力吸收新的知识,跟上互联网进步的节奏是很重要的。

    展开全文
  • 2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...
  • 2个目标文件 摘要:Java源码,网络相关,UDP 基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式...
  • 网络机制的实现是靠平台实现的,除非自己开发平台,否则是不需要知道socket怎么实现,怎么监听访问的。因此在这方面花太多的功夫就偏离了"将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平台"这一假设。...
  •  11.3.5 其他底层事件 216  11.3.6 事件的高级编写方法 217  11.4 小结 219  第12章 捉迷藏游戏(事件) 220  教学视频:5分钟  12.1 捉迷藏游戏原理 220  12.1.1 项目结构框架分析 220  12.1.2 项目...
  • 查看器、日记簿、查找和替换项目、图像轮显动画项目、applet事件监听项目、动画播放项目、网络聊天室、ftp服务器 客户端、web服务器、qq聊天工具、人员信息管理项目、中国象棋游戏、俄罗斯方块游戏网络版、图书管理...
  • 涵盖的主要内容有搭建java开发环境、java面向对象编程、java新特性、学生并发接水、模拟做饭场景、火车站售票系统、生产者与消费者问题、关机工具、典型的图形用户界面、计算器、秒表、捉迷藏游戏、鼠标绘直线、指针...
  • 涵盖的主要内容有搭建java开发环境、java面向对象编程、java新特性、学生并发接水、模拟做饭场景、火车站售票系统、生产者与消费者问题、关机工具、典型的图形用户界面、计算器、秒表、捉迷藏游戏、鼠标绘直线、指针...
  • Android代码-AppUninstall

    2019-08-05 18:33:42
    本程序采用第5种解决方案,对其进行优化,通过linux中的inotify机制监听应用的卸载。 实现 fork()子进程 创建监听文件 初始化inotify实例 注册监听事件 调用read函数开始监听 卸载反馈统计 场景 正常卸载 断网
  • 编程需要注意些什么

    2014-03-18 23:38:18
    网络机制的实现是靠平台实现的,除非自己开发平台,否则是不需要知道socket怎么实现,怎么监听访问的。因此在这方面花太多的功夫就偏离了“将来的应用开发是在成熟的平台上展开,而不是自己从底层开发平
  • 详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...
  • 详细而深入,对MongoDB的开发和管理方法进行了详细的讲解,也对MongoDB的工作机制进行了深入的探讨。注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学...
  • 3.2.1 数据库索引的底层实现原理和优化 3.2.2 HTTP和HTTPS的主要区别? 3.2.3 如何设计一个高并发的系统? 3.2.4 两条相交的单向链表,如何求他们的第一个公共节点? 3.2.5 求单向局部循环链表的环入口? 3.2.6 IP...
  • 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下...
  • 7.9.1 java.lang.instrument包的工作原理 7.9.2 如何向JVM中注册转换器 7.9.3 使用JVM启动参数注册转换器的问题 7.10 使用LTW织入切面 7.10.1 Spring的LoadTimeWeaver 7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下...
  • 黑马安卓52期视频教程

    热门讨论 2015-06-24 22:15:48
    07_断点续传的原理&进度临时文件的生成 08_断点续传的实现 09_把多线程断点续传移植至手机 10_添加进度条 11_文本进度 12_xUtils day06_Android应用开发-页面跳转和数据传递 01_AndroidManifest文件中的几个细节 02...
  • 该案例中:在基础组件库中主要有,网络请求,图片加载,通信机制,工具类,分享功能,支付功能等等。当然,我把一些公共第三方库放到了这个基础组件中! 4.3 项目组件化架构图,如下所示 4.4 组件通信是通过...

空空如也

空空如也

1 2
收藏数 38
精华内容 15
关键字:

java监听机制底层原理

java 订阅