本地线程

面试(三)

匿名 (未验证) 提交于 2019-12-03 00:11:01
method:发送数据的方式; action:发给谁 单选框和复选框,name值必须相同,value值可以不同 单选:type=radio 复选:type=checkbox 常见浏览器的内核: Trident内核: IE浏览器,360,搜狗浏览器等 Gecko内核: Firefox浏览器 Presto内核: Opera(原为Presto内核,现在为Blink) Webkit内核: Google Chrome http常见的状态码有那些? 200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 500 - 内部服务器错误 Integer与int的区别 ① int 是java提供的8种原始 数据类型之一 。Java为每个原始类型提供了封装类,Integer是java为int提供的 封装类 。int的默认值为 0 ,而Integer的默认值为 null , 即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况 ,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

八、多线程为什么会出现安全问题

匿名 (未验证) 提交于 2019-12-03 00:02:01
前言:   在前面我们主要介绍了一下线程的创建,一些枯燥的概念,以及线程间如何通信和多线程存在线程安全的问题,那么为什么多线程在执行的时候会造成安全问题呢,这一问题我们并没有深入的进入下去,下面我们来了解一下所谓的线程安全倒地时怎么来的。 一、内存模型简述   java内存模型之前专门写过一篇总结,虽然都是拿网上的资料东拼西凑的,也多次的去掌握这方面知识,但一些东西还是不了解,网上有很多资料,这里不久过多赘述,知识简单的描述一下。   了解的同学都知道java内存模型被分为了五个区域,程序计数器、堆、虚拟机栈、本地方法栈以及方法区,理论上方法区也是属于堆中的一部分,只不过方法区是堆中的一块永久区域,也就是垃圾回收不是很频繁,但绝不是不进行垃圾回收,而堆中的垃圾回收则相对频繁的进行,我们稍微来看一下五个区域的作用,下面上网上的一张分区图。      程序计数器:     我们都知道线程之间的执行时并发的,既然是并发的那就存在频繁切换,如果线程A执行一段代码执行到一半,线程抢到了CPU执行权,当线程B执行完后,如何能够找到线程A被抢断执行到的位置呢,这就是计数器的作用。      也就因此每个线程都对一个程序计数器,且是该线程独享的,也就是私有(若不是私有的则找不到被打断是哪个线程的哪一行代码),而计数器就记录了线程正在执行的内存地址,以确保被打断是能够回到原来的地方再次执行。  

ThreadLocal

匿名 (未验证) 提交于 2019-12-02 23:47:01
1 、定义 threadLocal:更好理解为threadLocalvalue,用于存储本线程中变量,该变量对其他线程而言是不可见的 2 、局限 线程之间不能做到数据共享,不管是不是同一个对象的线程还是不同对象的线程,不同线程之间不能做到数据共享,从而无法解决共享对象的更新问题;每个线程往ThreadLocal中读、写数据线程之间都是隔离的,互相之间互不影响 局限相关代码示例: package com.threadlocal2; public class ThreadLocalT implements Runnable { //ThreadLocal变量初始化 private static ThreadLocal<Integer> ticket=new ThreadLocal<Integer>(){ public Integer initialValue() { System.out.println("调用get方法时,当前线程共享变量没有设置,调用initialValue获取默认值!"); return 3; } }; public void run(){ while (true){ if(ticket.get()>0){ ticket.set(ticket.get()-1); System.out.println(Thread.currentThread().getName()

JVM内存结构

匿名 (未验证) 提交于 2019-12-02 23:42:01
Java : OSGI 混合语言 JVM google Kotlin Android Scala(Kafka) 多核并行 CPU JDK1.7 Fork/Join JDK1.8 lambda ( ) 丰富语法: JDK5 ( ) JDK7 try-catch-finally try-with-resource 64 64 32 64 32 JVM 4G CMS G1 JDK11 ZGC 10 TB JDK12 JDK13( 2019 9 ) 4TB 16TB Java SE JavaSE Java Java EE Java ME JDK Java JDK JRE JRE JRE Java SE Java Java JVM java JavaSE 运行时数据区域 JVM C++ = + ---- java --- --- Java 线程私有 程序计数器 较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响(面试可能问到为什么需要) Java Natvie Undefined OutOfMemoryError JVM iload_1 第二个 int bipush 将一个 byte isub 栈顶两int型数值相减,并且结果进栈 istore_1 将栈顶int型数值存入第二个局部变量 栈: java JVM StackFilo 虚拟机栈: 异常:

通俗理解进程,线程,程序,jvm实例间的关系

匿名 (未验证) 提交于 2019-12-02 23:40:02
文章目录 前言 进程定义 线程定义 程序定义 jvm实例 它们之间的辨析 打个比方 参考文章 前言 整理了一下它们的关系。但求有所收获。 进程定义 狭义定义:进程是正在运行的程序的实例 概念要点:进程是一个 实体 。每一个进程都有它自己的 地址空间 ,一般情况下,包括 文本区域、数据区域和堆栈 。文本区域存储处理器执行的 代码 ;数据区域存储变量和进程执行期间使用的动态分配的 内存 ;堆栈区域存储着活动过程调用的 指令和本地变量 。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体(是静态的),只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体(是动态的),我们称其为进程(=跑起来的程序【//代码】) 线程定义 定义:独立运行在进程中的子任务叫做线程。例如QQ可同时处理好友视频,下载文件,传输数据,发送表情等任务。这些都是线程。 程序定义 定义:程序是一组计算机能识别和执行的指令 jvm实例 定义:跑起来的jvm程序就叫jvm实例(个人定义),一个jvm实例(包括方法区,堆,java栈,程序计数器和本地方法栈5部分),就对应着一个进程。例如跑起来的tomcat,eclipse,oracle,它们都运行在jvm上,它们都对应着一个jvm实例,它们都是一个独立的进程。JVM的每个实例都有一个它自己的方法域和一个堆,运行于JVM内的所有的线程都共享这些区域

ZGC,一个超乎想象的垃圾收集器

匿名 (未验证) 提交于 2019-12-02 23:32:01
  Z Garbage Collector,即ZGC,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:   停顿时间不会超过10ms   停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在10ms以下)   可支持几百M,甚至几T的堆大小(最大支持4T)   停顿时间在10ms以下,10ms其实是一个很保守的数据,在SPECjbb 2015基准测试,128G的大堆下最大停顿时间才1.68ms,远低于10ms,和G1算法相比,也感觉像是在虐菜。   G1算法通过只回收部分Region,避免了全堆扫描,改善了大堆下的停顿时间,但在普通大小的堆里却表现平平,ZGC为什么可以这么优秀,主要是因为以下几个特性。   Concurrent   ZGC只有短暂的STW,大部分的过程都是和应用线程并发执行,比如最耗时的并发标记和并发移动过程。   Region-based   ZGC中没有新生代和老年代的概念,只有一块一块的内存区域page,以page单位进行对象的分配和回收。   Compacting   每次进行GC时,都会对page进行压缩操作,所以完全避免了CMS算法中的碎片化问题。   NUMA-aware   现在多CPU插槽的服务器都是Numa架构,比如两颗CPU插槽(24核),64G内存的服务器,那其中一颗CPU上的12个核,访问从属于它的32G本地内存

[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)(转)

非 Y 不嫁゛ 提交于 2019-12-02 23:10:20
如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html 谢谢. 上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大家. 对于这次跳槽找工作, 我准备了挺长的时间, 其中也收集了很多比较好的笔试 面试题 , 大都是一些常用的基础, 很多都是由于时间原因没有来得及给出答案, 但是题目大都是比较经典实用的, 现在都放到这里, 希望对正处于找工作的博友有一定的帮助. 第一部分: Java基础(此部分面试题题目来自:http://www.hollischuang.com/archives/10 答案是搜集与互联网) (为了方便,我把他们分了类,有一些是必看的,我用!标注,有一些进阶型的我用%标注,有一些需要了解的,我用?标注。) 一:继承、抽象类与接口区别、访问控制(private, public, protected,默认)、多态相关 !1、interface和 abstract class的区别 interface是接口,abstract class是抽象类。 1,语法层次 抽象类中可以拥有任意范围的成员数据,可以定义非抽象方法。而接口中只能拥有静态的不能修改的成员数据,同时所有的方法必须是抽象的。 所以说接口是抽象类的一种特例。 2,跨域不同 a,抽象类是对类的整体进行抽象,包括类的属性和行为

C++多线程框架

匿名 (未验证) 提交于 2019-12-02 22:56:40
Thread线程框架 线程定义: 线程可以理解为一个特立独行的函数。其存在的意义,就是并行,避免了主线程的阻塞。 ----------------------------thread与函数---------------------------------- 线程启动    C++ 线程的启动, 只需要 #include <thread> 即可。 线程对象的创建, 意味着线程的开始。 1)同步 #include <iostream> #include <thread> #include <unistd.h> using namespace std; void func() { cout << " thread id: " <<this_thread::get_id()<< endl; cout << " do some work " << endl; sleep( 3 ); } int main() { cout << " maint thread id: " <<this_thread::get_id()<< endl; thread t(func); t.join(); return 0 ; }    t.join 和 t.detach 标志着, 线程对象和线程的关系。 t.join 表示, 线程与线程对象 表示, 线程与线程对象的异步关系。    detach 后的线程,不能再

RocksDB线程局部缓存

匿名 (未验证) 提交于 2019-12-02 22:06:11
概述 在开发过程中,我们经常会遇到并发问题,解决并发问题通常的方法是加锁保护,比如常用的spinlock,mutex或者rwlock,当然也可以采用无锁编程,对实现要求就比较高了。对于任何一个共享变量,只要有读写并发,就需要加锁保护,而读写并发通常就会面临一个基本问题,写阻塞读,或则写优先级比较低,就会出现写饿死的现象。这些加锁的方法可以归类为悲观锁方法,今天介绍一种乐观锁机制来控制并发,每个线程通过线程局部变量缓存共享变量的副本,读不加锁,读的时候如果感知到共享变量发生变化,再利用共享变量的最新值填充本地缓存;对于写操作,则需要加锁,通知所有线程局部变量发生变化。所以,简单来说,就是 读不加锁,读写不冲突,只有写写冲突 。这个实现逻辑来源于Rocksdb的线程局部缓存实现,下面详细介绍Rocksdb的线程局部缓存ThreadLocalPtr的原理。 线程局部存储(TLS) 简单介绍下线程局部变量,线程局部变量就是每个线程有自己独立 的副本,各个线程对其修改相互不影响,虽然变量名相同,但存储空间并没有 关系。一般 在linux 下,我们可以通过以下三个函数来实现线程局部存储创建,存取功能。 int pthread_key_create ( pthread_key_t * key , void (* destr_function ) ( void *)), int pthread

MySQL主从同步与主主同步

匿名 (未验证) 提交于 2019-12-02 22:02:20
MySQL复制: 复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循坏,这些日志可以记录发送到从服务器的更新。当一个从服务器 连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知的更新。 需注意的是: (1)mysql支持哪些复制 a.基于语句的复制:在主服务器上执行的sql语句,在从服务器上执行同样的语句。mysql默认采用基于语句的复制,效率边角高。一旦发现没法精确复制时,会自动选着基于行的复制。 (2)mysql复制解决的问题 注意几点: log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和 master数据保持一致了。 Mysql复制的流程图如下: 如上图所示: dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。 SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据