线程

【全集】大数据Java基础

自作多情 提交于 2020-03-05 19:19:33
课程介绍 本课程是由猎豹移动大数据架构师,根据Java在公司大数据开发中的实际应用,精心设计和打磨的大数据必备Java课程。通过本课程的学习大数据新手能够少走弯路,以较短的时间系统掌握大数据开发必备语言Java,为后续大数据课程的学习奠定了坚实的语言基础。 适用人群 1.想学大数据没有语言基础的学员 2.想学大数据没有Java语言基础的学员 3.转行想学大数据的学员 4.了解Java,大数据Java知识体系不完整的学员 课程视频下载地址(视频完整,无加密) 链接: https://pan.baidu.com/s/1DWy5kDLjrsNSv98yPiicYQ 提取码:twzr 课程大纲 大数据Java第一堂课 1.大数据开发为什么选择Java 2.从事大数据开发Java学到什么程度 3.我该如何学习Java 大数据Java Stage01 1.课程介绍 2.计算机基础常识介绍 3.Java语言概述 4.JRE和JDK的区别 5.JDK下载+安装+配置 6.Java入门程序开发 7.开发工具介绍及Eclipse安装 8.Eclipse基本使用 9.Eclipse快捷键的使用 10.Eclipse项目导出和导入 大数据Java Stage02 1.关键字介绍 2.标识符介绍 3.注释介绍 4.常量介绍 5.变量介绍 6.数据类型介绍及使用 7.数据类型转换 8.算术运算符 9

C# AsyncLocal 和CallContext

℡╲_俬逩灬. 提交于 2020-03-05 18:08:42
AsyncLocal<string> data = new AsyncLocal<string>(); data.Value = "lcc"; for (int i = 0; i < 20; i++) { var current = i; Thread.Sleep(500 * current); Task.Run(() => { Console.WriteLine($"-----[{current}]-----Begin:{data.Value}"); data.Value = current + "lcc"; Console.WriteLine($"-----[{current}]-----End:{data.Value}"); }); Console.WriteLine($"-----[{current}]-----Current:{data.Value}"); } Console.ReadLine(); 运行结果: Begin 都是 初始值,即使在其他线程中 更改了data.value 其他线程也不会同步,并且主线程中 仍为 lcc CallContext (线程上下文) LogicalCallContext ExecutionContext(执行上下文) AsyncLocal (多线程共享变量) ThreadLocal (线程内变量) 来源: https://www

几种网络服务器模型的介绍与比较

五迷三道 提交于 2020-03-05 16:52:59
原文链接 前言 事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接数高吞吐量的服务器程序中,如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。 关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文将不拘泥于源代码的陈列与分析,而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。 本文涉及到线程 / 时间图例,只为表明线程在各个 IO 上确实存在阻塞时延,但并不保证时延比例的正确性和 IO 执行先后的正确性;另外,本文所提及到的接口也只是笔者熟悉的 Unix/Linux 接口,并未推荐 Windows 接口,读者可以自行查阅对应的 Windows 接口。 阻塞型的网络编程接口 几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器 / 客户机的模型。 我们假设希望建立一个简单的服务器程序,实现向单个客户机提供类似于“一问一答”的内容服务。 图 1. 简单的一问一答的服务器 / 客户机模型 我们注意到,大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用(一般是

go学习笔记

孤者浪人 提交于 2020-03-05 16:27:12
变量 命名规范 变量需要以小驼峰方式来命名,列如: var studentName string 声明方式 直接声明类型 var childName string childName = "mark" 直接赋值 var childName = "mark" 简短赋值 childName := "mark" 简短赋值只能用在func内 常量 定义方式 const pi = 3.1415926 const ( n1 = 100 n2 n3 //n2,n3值与上面n1一致 ) iota go语言中常量计数器,只能在常量中使用。初始化时为0,const中每新增一行常量声明将使iota计数一次 const ( a = iota //0 b //1 c //2 _ d //4 ) 字符串 go语言中字符串使用双引号,单引号是字符 name := "mark" desc := "good" personDesc := name + desc personDesc := fmt . Sprintf ( "%s%s" , name , desc ) //字符串分割 info := "ddd/ddd/dddd/dd" ret := strings . Split ( info , "/" ) //包含 strings . Contains //判断前缀和后缀 strings . HasPrefix

多线程编程bug起源分析

冷暖自知 提交于 2020-03-05 16:20:30
一、多线程的起源 对于软件工程师,整个代码执行的过程中主要关注CPU、内存和I/O这三个方面;在计算机快速发展的阶段,主要是这三个方面在快速发展;但这三方面一直存在这一个严重的矛盾,即运行速度;CPU的运行速度是是最快的,内存次之,IO是最慢的;举个例子来说,CPU是天上一天,内存就是地上一年。若内存是天上一天,IO就是地上十年; 根据木桶理论,限制程序运行速度的是IO。每次在执行IO操作时,CPU都会被闲置;为了最高效的利用CPU的计算资源,平衡这三者的速度差异。计算机体系结构、操作系统和编译程序都做了平衡,主要体现在以下三点: 1、为了均衡CPU和内存的速度差异,给CPU配置专门的缓存; 2、操作系统增加了线程和进程。以分时复用CPU来平衡CPU与IO的时间差; 3、编译程序优化指令执行次序,确保缓存可以被合理的使用; 二、多线程BUG源头 1、缓存导致的可见性问题 1)在单核CPU的时代,所有的线程都是操作同一个CPU的缓存,所以对于所有的线程来说,CPU的缓存都是共享且可见的;但在多核CPU的时代,每个CPU都会有自己的缓存,不同的线程被分配到不同的CPU。就会导致多个线程在不同的CPU缓存中操作同一个变量时,该变量在每一个缓存中都是只对操作该CPU的线程可见,对其它CPU对应的线程是不可见的。不能保证该变量的强一致性; 代码示例: public class Test1 {

【诡异并发三大恶人】原子性

余生颓废 提交于 2020-03-05 14:58:13
转:https://mp.weixin.qq.com/s/UiaXvnjc0NFfNMLf2lUq4A 前言、原子性的阐述 一个或者多个操作在 CPU 执行的过程中不被中断的特性称为原子性。 我理解是一个操作不可再分,即为 原子性 。而在并发编程的环境中,原子性的含义就是只要该线程开始执行这一系列操作,要么全部执行,要么全部未执行,不允许存在执行一半的情况。 我们试着从数据库事务和并发编程两个方面来进行对比: 1、在数据库中 原子性概念是这样子的:事务被当做一个不可分割的整体,包含在其中的操作要么全部执行,要么全部不执行。且事务在执行过程中如果发生错误,会被回滚到事务开始前的状态,就像这个事务没有执行一样。(也就是说:事务要么被执行,要么一个都没被执行) 2、在并发编程中 原子性概念是这样子的: 第一种理解:一个线程或进程在执行过程中,没有发生上下文切换。 上下文切换:指 CPU 从一个进程/线程切换到另外一个进程/线程(切换的前提就是获取 CPU 的使用权)。 第二种理解:我们把一个线程中的一个或多个操作(不可分割的整体),在 CPU 执行过程中不被中断的特性,称为原子性。(执行过程中,一旦发生中断,就会发生上下文切换) 从上文中对原子性的描述可以看出,并发编程和数据库两者之间的原子性概念有些相似: 都是强调,一个原子操作不能被打断! ! 而非原子操作用图片表示就是这样子的:

java中级,知识点归纳(一)

社会主义新天地 提交于 2020-03-05 12:25:34
一、接口和抽象类的区别 抽象类中可以含有构造方法,而接口内不能有。 抽象类中可以有普通成员变量,而接口中不能有。 抽象类中可以包含非抽象的普通方法,而接口中所有方法必须是抽象的,不能有非抽象的普通方法。 抽象类中的抽象方法的访问类型可以是public、protected和默认类型,但接口中的抽象方法只有public和默认类型。 抽象类中可以包含静态方法,接口内不能包含静态方法。 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以是任意,但接口中定义的变量只能是public static类型,并且默认为public static类型。 一个类可以实现多个接口,但只能继承一个抽象类。 接口更多的是在系统框架设计方法发挥作用,主要定义模块之间的通信,而抽象类在代码实现方面发挥作用,可以实现代码重用。 二、java虚拟机的运行时数据区有几块?线程私有和线程共享区域有哪些? 程序计数器:线程私有,当前线程执行的字节码的行号指示器。 虚拟机栈:线程私有,存放基本数据类型、对象引用和returnAddress类型。 本地方法栈:为虚拟机使用到的Native方法服务。 java堆:线程共享,存放对象的实例,也是GC回收器管理的主要区域。 方法区:线程共享,存放已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。 运行时常量池:方法区的一部分

Java NIO 底层原理

旧城冷巷雨未停 提交于 2020-03-05 10:06:43
目录 1.1. Java IO读写原理 1.1.1. 内核缓冲与进程缓冲区 1.1.2. java IO读写的底层流程 1.2. 四种主要的IO模型 1.3. 同步阻塞IO(Blocking IO) 1.4. 同步非阻塞NIO(None Blocking IO) 1.5. IO多路复用模型(I/O multiplexing) 1.6. 异步IO模型(asynchronous IO) 小结一下: 本文的知识,在《 Netty Zookeeper Redis 高并发实战 》 1.1. Java IO读写原理 无论是Socket的读写还是文件的读写,在Java层面的应用开发或者是linux系统底层开发,都属于输入input和输出output的处理,简称为IO读写。在原理上和处理流程上,都是一致的。区别在于参数的不同。 用户程序进行IO的读写,基本上会用到read&write两大系统调用。可能不同操作系统,名称不完全一样,但是功能是一样的。 先强调一个基础知识:read系统调用,并不是把数据直接从物理设备,读数据到内存。write系统调用,也不是直接把数据,写入到物理设备。 read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。这个两个系统调用,都不负责数据在内核缓冲区和磁盘之间的交换。底层的读写交换

Linux中的线程局部存储(二)

六月ゝ 毕业季﹏ 提交于 2020-03-05 09:44:05
在 Linux中还有一种更为高效的线程局部存储方法,就是使用关键字__thread来定义变量。__thread是GCC内置的线程局部存储设施 (Thread-Local Storage),它的实现非常高效,与pthread_key_t向比较更为快速,其存储性能可以与全局变量相媲美,而且使用方式也更为简单。创建线程 局部变量只需简单的在全局或者静态变量的声明中加入__thread说明即可。 列如: static __thread char t_buf[32] = {'\0'}; extern __thread int t_val = 0; 凡是带有__thread的变量,每个线程都拥有该变量的一份拷贝,且互不干扰。线程局部存储中的变量将一直存在,直至线程终止,当线程终止时会自动释放这一存储。__thread并不是所有数据类型都可以使用的,因为其只支持POD(Plain old data structure) [1] 类型,不支持class类型——其不能自动调用构造函数和析构函数。同时__thread可以用于修饰全局变量、函数内的静态变量,但是不能用于修饰函数的局部变量或者class的普通成员变量。另外,__thread变量的初始化只能用编译期常量,例如: __thread std::string t_object_1 ("Swift"); // 错误,因为不能调用对象的构造函数 _

Linux中的线程局部存储(一)

∥☆過路亽.° 提交于 2020-03-05 09:43:37
在 Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对 程序的性能带来了很大的影响,当然对于那些系统原生支持原子操作的数据类型来说,我们可以使用原子操作来处理,这能对程序的性能会得到一定的提高。那么对 于那些系统不支持原子操作的自定义数据类型,在不使用锁的情况下如何做到线程安全呢?本文将从线程局部存储方面,简单讲解处理这一类线程安全问题的方法。 一、数据类型 在C/C++程序中常存在全局变量、函数内定义的静态变量以及局部变量,对于局部变量来说,其不存在线程安全问题,因此不在本文讨论的范围之内。全局变量 和函数内定义的静态变量,是同一进程中各个线程都可以访问的共享变量,因此它们存在多线程读写问题。在一个线程中修改了变量中的内容,其他线程都能感知并 且能读取已更改过的内容,这对数据交换来说是非常快捷的,但是由于多线程的存在,对于同一个变量可能存在两个或两个以上的线程同时修改变量所在的内存内 容,同时又存在多个线程在变量在修改的时去读取该内存值,如果没有使用相应的同步机制来保护该内存的话,那么所读取到的数据将是不可预知的,甚至可能导致 程序崩溃。 如果需要在一个线程内部的各个函数调用都能访问、但其它线程不能访问的变量,这就需要新的机制来实现,我们称之为Static memory local to