本地线程

线程安全—可见性和有序性

馋奶兔 提交于 2019-12-21 18:57:04
在并发编程中,需要处理的两个关键问题: 线程之间如何通信 以及 线程之间如何同步 。 通信 是指线程之间以或者机制交换信息,java的并发采用的是共享内存模型,线程之间共享程序的公共状态,通过读写内存中的公共状态进行隐式通信。 同步 是是指程序中用于控制不同线程间操作发生相对顺序的机制。 最开始首先应该知道计算机中的 缓存 在其中起的作用 CPU Cache(高速缓存):由于计算机的存储设备与处理器的处理设备有着几个数量级的差距,所以现代计 算机都会加入一层读写速度与处理器处理速度接近相同的高级缓存来作为内存与处理器之间的缓冲,将运 算使用到的数据复制到缓存中,让运算能够快速的执行,当运算结束后,再从缓存同步到内存之中,这 样,CPU就不需要等待缓慢的内存读写了。 主(内)存:一个计算机包含一个主存,所有的CPU都可以访问主 存,主存比缓存容量大的多(CPU访问缓存层的速度快于访问主存的速度!但通常比访问内存寄存器的速度还是要慢点) 运作原理:通常情况下,当一个CPU要读取主存(RAM - Main Mernory)的时候,他会将主存中的数据读 取到CPU缓存中,甚至将缓存内容读到内部寄存器里面,然后再寄存器执行操作,当运行结束后,会 将寄存器中的值刷新回缓存中,并在某个时间点将值刷新回主存。 为什么需要CPU Cache? 答:CPU 的频率太快了,快到主存跟不上

threadLocal 和 线程池 问题记录

孤街浪徒 提交于 2019-12-21 13:43:21
threadLocal 和 线程池 问题记录 问题 在web应用中,获取用户的身份后,使用filter将身份信息采用putIfAbsent的形式放在了 threadLocal 中。循环请求servlet,发现用户身份没有变化。 解析 只有当ThreadLocal的生命周期受限于Task的生命周期时,在Thread Pool的Thread里使用ThreadLocal才有意义。 在线程池的线程中不应该使用ThreadLocal在任务之间传递值。 ThreadLocal的生命周期不等于一次request请求的生命周期,每个request请求的响应是tomcat从线程池中分配的线程,线程会被下个请求复用。所以请求结束后必须删除线程本地变量。 在使用ThreadLocal的时候管理它的创建、销毁,那么就可以用。 来源: CSDN 作者: 是小黄鸡不是小黄鸭 链接: https://blog.csdn.net/weixin_41004986/article/details/103642444

线程基础

点点圈 提交于 2019-12-21 08:38:44
线程基础 1.线程的创建方式 线程的实现方式三种: 继承Thread类。 实现Runnable接口。 实现Callable接口,使用 ExecutorService、Callable、 Future 实现带返回结果的多线程。 例:继承Thread类。 /** * 继承Thread类创建线程 */ public class ThreadCreate1 extends Thread{ @Override public void run() { try { //TODO TimeUnit.SECONDS.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { ThreadCreate1 t1 = new ThreadCreate1(); ThreadCreate1 t2 = new ThreadCreate1(); t1.start(); t2.start(); } } 例:实现Runnable接口 /** * 实现Runnable接口的方式创建线程 */ public class ThreadCreate2

[Java基础] 使用JMAP dump及分析dump文件

点点圈 提交于 2019-12-21 07:40:15
转载: http://blog.csdn.net/kevin_luan/article/details/8447896 http://liulinxia02.blog.163.com/blog/static/26868772009111861834942/ http://zhumeng8337797.blog.163.com/blog/static/100768914201242410583187/ 其中jmap是java自带的工具 查看整个JVM内存状态 jmap -heap [pid] 要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况 jmap -histo [pid] 导出整个JVM 中内存信息 jmap -dump:format=b,file=文件名 [pid] jhat是sun 1.6及以上版本中自带的一个用于分析JVM 堆DUMP 文件的工具,基于此工具可分析JVM HEAP 中对象的内存占用情况 jhat -J-Xmx1024M [file] 执行后等待console 中输入start HTTP server on port 7000 即可使用浏览器访问 IP:7000 eclipse Memory Analyzer Eclipse 提供的一个用于分析JVM 堆Dump文件的插件

2019/12/19 03-thread-local和Timer

不羁岁月 提交于 2019-12-21 02:32:32
threading.local 先看一下简单程序 asctime 时间,threadname线程明,message消息, logging在info级别,默认实在warning级别 现在里面写的就是未来的信息了,msg x就是上面的message消息 这5个线程用的都是局部的变量,这5个worker线程执行的时候互不干扰,每一个函数的局部变量x都是在这个线程上的栈压进去的,这些局部变量互不干扰。各自在各自的线程上 最后都是一样的 做一个猜测,只要你使用的局部变量,就是很安全的,只在各自的当前环境使用,只在线程这个函数的栈上使用,虽然这个对象可能在堆上创建的,但是只归这个函数使用,互不干扰 试试一个全局变量,全局的边界是当前模块,global x 告诉x是全局作用域去找 再执行一次 前面线程加完,全局x刚用完,后面线程来的时候,紧接着代表全局变量直接加了,最后都是500次的加,次数是不会少的,该加多少是多少 如果要每次加都得到100,就需要使用局部变量,不能使用none local(none local 是在本地作用域不定义,在外层非global的区域定义,这里使用none local就到全局里去了 现在添加一个类,用一个全局的实例来解决a.x+1 如果想每次得到的结果是100,但是又想用全局变量,该如何做,python提供了local这样的一个类 定义了__slots__就是两个属性

Java面试题库及答案解析

核能气质少年 提交于 2019-12-20 23:48:06
1、面向对象编程(OOP)有哪些优点? 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性。 2、面向对象编程有哪些特性? 封装、继承、多态、抽象 封装 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它内部的数据。在Java当中,有3种修饰符:public,private和protected。每一种修饰符给其他的位于同一个包或者不同包下的对象赋予了不同的访问权限。 下面列出了使用封装的好处: 通过隐藏对象的属性来保护对象内部的状态。 提高了代码的可用性和可维护性,因为对象的行为可以被单独的改变或者是扩展。 禁止对象之间的不良交互提高模块化。 继承 继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用,也可以在不修改类的情况下给现存的类添加新特性。 多态 多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作可以应用到其他类型的值上面。 抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。Java支持创建只暴露接口而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。 3、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程

华为C/C++笔试题(附答案,华为面试题系列)

泪湿孤枕 提交于 2019-12-20 17:13:11
1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。 3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用 2.引用与指针有什么区别? 1) 引用必须被初始化,指针不必。 2) 引用初始化以后不能被改变,指针可以改变所指的对象。 3) 不存在指向空值的引用,但是存在指向空值的指针。 3.描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性。 4.全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在静态数据库,局部变量在堆栈。 5.什么是平衡二叉树? 左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1。 6.堆栈溢出一般是由什么原因导致的? 没有回收垃圾资源。 7.什么函数不能声明为虚函数? constructor函数不能声明为虚函数。 8.冒泡排序算法的时间复杂度是什么? 时间复杂度是O(n^2)。 9.写出float x 与“零值”比较的if语句。 if(x>0.000001&&x<-0.000001) 10.Internet采用哪种网络协议?该协议的主要层次结构?

二、创建进程和线程

浪子不回头ぞ 提交于 2019-12-20 16:38:44
1、在 Windows 操作系统中创建进程   在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程。更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例):   第一步:windows+R,输入cmd,打开 cmd 命令提示符          第二步:在命令提示符中输入 notepad,按 Enter 键便会弹出记事本应用软件        PS:常用的windows 应用软件命令     1、regedit:打开注册表编辑器     2、control:打开控制面板     3、msconfig:打开系统配置     4、gpedit.msc:打开本地组策略     5、explorer:打开资源管理器     6、taskmgr:任务管理器     7、logoff:直接注销计算机     8、osk:打开屏幕键盘     9、calc:打开计算器     10、mspaint:调出画图软件     11、dxdiag:查看电脑详细配置信息     12、mstsc:打开远程桌面连接     13、systeminfo:查看计算机基本信息     14、notepad:打开记事本 回到顶部 2、在 Java 中创建进程 第一种方法:通过 Runtime 类的 exec() 方法来创建进程 1 2 3 4 5

Java内存结构

风格不统一 提交于 2019-12-20 11:48:27
转载: 原文链接: https://blog.csdn.net/qq906627950/article/details/81324825 运行时数据区 JVM所管理的内存包括以下几个运行时数据区域,如图所示 方法区和堆为线程共享区,虚拟机栈、本地方法栈及程序计数器为线程独占区。 程序计数器 程序计数器是一块较小的空间,它可以看作是当前线程所执行的字节码的行号指示器。 如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址(可以理解为上图所示的行号),如果正在执行的是native方法,这个计数器的值为undefined。 JVM的多线程是通过线程轮流切换并分配CPU执行时间片的方式来实现的,任何一个时刻,一个CPU都只会执行一条线程中的指令。为了保证线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程间的程序计数器独立存储,互不影响。 此区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域,因为程序计数器是由虚拟机内部维护的,不需要开发者进行操作。 虚拟机栈 每个线程有一个私有的栈,随着线程的创建而创建,生命周期与线程相同。 虚拟机栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表、操作数栈、动态链接、方法出口等信息。

并发编程之多线程

故事扮演 提交于 2019-12-20 08:56:07
为什么有线程安全问题? 当多个线程同时共享,同一个 全局变量或静态变量 ,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。 线程安全解决办法: 问:如何解决多线程之间线程安全问题 答:使用多线程之间同步synchronized或使用锁(lock)。 问:为什么使用线程同步或使用锁能解决线程安全问题呢? 答:将可能会发生数据冲突问题(线程不安全问题),只能让当前一个线程进行执行。代码执行完成后释放锁,让后才能让其他线程进行执行。这样的话就可以解决线程不安全问题。 问:什么是多线程之间同步 答:当多个线程共享同一个资源,不会受到其他线程的干扰。 内置的锁 Java提供了一种内置的锁机制来支持原子性 每一个Java对象都可以用作一个实现同步的锁,称为内置锁,线程进入同步代码块之前自动获取到锁,代码块执行完成正常退出或代码块中抛出异常退出时会释放掉锁 内置锁为互斥锁,即线程A获取到锁后,线程B阻塞直到线程A释放锁,线程B才能获取到同一个锁 内置锁使用synchronized关键字实现,synchronized关键字有两种用法: 1.修饰需要进行同步的方法(所有访问状态变量的方法都必须进行同步),此时充当锁的对象为调用同步方法的对象 2.同步代码块和直接使用synchronized修饰需要同步的方法是一样的,但是锁的粒度可以更细