阅读更多

8顶
4踩

编程语言

转载新闻 Java知识库,程序员必须Mark!

2014-11-10 10:50 by 正式编辑 cao345657340 评论(10) 有11569人浏览
1. 若JVM进程中,只剩下后台线程,则该进程就结束了。可以使用setDaemon(true)将线程设置为后台线程。

2. 使用线程的join()方法,可以等待多个线程子任务执行完成后,进行合并结果的操作;但是join只是对线程单纯的顺序join,但是这个顺序不一定是线程真正结束的顺序,而CompletionService可以按照线程结束后的顺序给我们返回结果。另外,一个更大的区别在于线程的Join操作是针对线程的合并操作,这就意味着为每个任务创建对应的线程,如果任务数很多将导致创建大量的线程来处理,而CompletionService是基于线程池的任务,无论任务数量多少,线程的数量是可以控制的。

3. 线程是基于栈的,可以使用getStackTrace()方法,查看当前线程的栈轨迹。

4. 栈空间是每个线程私有的空间,当调用某方法时将给该私有栈分配空间,在方法内部再调用方法还会继续使用相应的栈空间,方法返回时收回相应的栈空间(不论是否抛出异常)。这块空间通常也叫做“工作内存”,堆空间也叫做“主内存”。

5. 普通变量的修改并不一定立即写回到主存,而线程读取时也不需要每一次都从主存中读取;

6. 使用volatile修饰变量,可以保证多线程中的共享变量始终是可见的(但这并不保证volatile引用对象内部的属性是完全可见的);

    volatile还有一个作用就是防止相关性代码的重排序,从指令级别达到了轻量级锁的目的。

7. 线程池初始化时是没有任何线程的,有任务是才会创建线程;而数据库连接池初始化时,是已经存有一定的连接了,否则用到时再创建会耗时的。

8. JDK动态代理在生成动态字节码时,并不是通过实现类创建子类的方式,而是通过类所拥有的接口列表来完成的。也就是说,生成的类和实际的类一点关系都没有,而是一个独立的类,只是方法名和接口的方法名完全一样。但是生成的代理对象初始化时,会传递一个handler参数,而这个handler里是包含实际实现类(target)的,所以代理类调用方法时,实际上是使用target调用方法的。

    顺便说一下,Cglib动态代理是继承实际类生成子类,调用方法时也不是使用反射(反射效率相对较低),而是使用FastClass通过索引调用相应的方法的。

9. spring配置文件中component-scan配置中的base-package属性是要扫描的路径,spring会扫描相应classpath下所有与base-package相关的路径,包括jar包的路径,但是不会遍历jar包里的类,所以如果把加载的Bean放在jar包中,那么即使是base-package="*"也是扫描不到的。

10. 在web应用中,可以通过 ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()获取到HttpServletRequest对象。

11. Spring将Connection对象放入了一个ThreadLocal变量中,而且是以Map的方法存在的,Map的key是DataSource。在具有事务的方法中我们拿到的连接不是Connection本身,而是被代理的对象,所以两次获取到的Connection的HashCode是不同的。但是代理类对象中目标对象是相同的(上面也说过),都是原始的Connection连接,所以如果在同一个事务中,那么无论多少次获取出来的连接,其内部的target属性都是同一个。

12. 使用双重锁判定可以大幅降低锁的征用。比如:
class ObjInstance {
        //单例
    private static ObjInstance oi = new ObjInstance();
 
    private static User user;
 
    private ObjInstance() {
    }
 
    public static User getUserInstance() {
 
        if (user == null) {// 无锁判定
            synchronized (oi) {
                if (user == null) {// 加锁判定
                    user = new User(1, "zs");
                }
            }
        }
 
        return user;
    }
 
}

13. 进程与线程的关系:

     比如有一个大工厂,里面每一个车间都是一个‘进程’,车间里的工人就是‘线程’,车间里有一个‘公共厕所’。那么,当工人上厕所时要锁上门,人少时直接就完事了;但人多时只能在厕所门口等,等里面的人出来才能进去(锁着门呢)。当然这只是一般的情况,并没有考虑优先级等。
来自: 开源社区
8
4
评论 共 10 条 请登录后发表评论
10 楼 hyhy2203390 2014-11-13 15:10
xiaohu7924 写道
这也敢叫知识库

aaaaaaa
9 楼 hyhy2203390 2014-11-13 15:09
qdjqojdq
8 楼 cywhoyi 2014-11-13 14:17
teasp 写道
12写得好搞笑。

我觉得不好笑,其实他要表达的意思我相信你我都懂得,但是不能这么亵渎别人的分享,
这里double check,应该在严谨点,能否再加一个弱类型的缓冲池,可能更好点呢?
7 楼 xiaohu7924 2014-11-12 10:17
这也敢叫知识库
6 楼 teasp 2014-11-11 14:56
12写得好搞笑。
5 楼 yixiandave 2014-11-11 09:23
component-scan表述不对,我们的项目里就是用component-scan扫描jar包里的类的
因为很多常用的业务无关的逻辑实现我们都已经整合发布成jar包了,包括ORM的封装,用户登陆,文件上传这些,只要引用一个jar包从controller-service到DAO都已经实现了
4 楼 laizhaoshi 2014-11-10 14:39
谨慎mark
3 楼 hyhy2203390 2014-11-10 14:20
javagui 写道
spring配置文件中component-scan。说的不详细

ljl961890233bear 写道
component-scan  值扫描 @component 的类吧

2 楼 ljl961890233bear 2014-11-10 13:51
component-scan  值扫描 @component 的类吧
1 楼 javagui 2014-11-10 13:16
spring配置文件中component-scan。说的不详细

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • (二)【Java程序员必背知识点】JVM

    Java 虚拟机对 Class 文件的每一部分(自然也包括常量 池)的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范上的要求,这样才会 被虚拟机认可、装载和执行。 2.3. JVM 运行时内存 Java 堆从 GC 的...

  • java程序员需要的虚拟机知识_程序员面试Java编程知识大全:最新版Java虚拟机(JVM)面试题(一)...

    Java内存区域说一下 JVM 的主要组成部分及其作用?JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface...

  • 最全最新的的Java核心知识点整理!!! 【推荐】

    JAVA 并发知识库 … 54 JAVA 线程实现/创建方式 … 54 继承 Thread 类 … 54 实现 Runnable 接口。… 54 ExecutorService、Callable、Future 有返回值线程…55 基于线程池的方式… 56 4 种线程池 … 56 … 57 … 57...

  • java程序员入门_Java程序员入门:简介

    java程序员入门 背景 Go (通常称为“ Golang”)是一种相当新的编程语言,于2007年首次提出,并于2012年发布了1.0版。它的三位发明者目前都是Google员工,具有令人印象深刻的证书。 肯·汤普森 ( Ken Thompson)...

  • java知识竞赛题库_java程序设计题库

    1、下面( A )数据类型可用于main()方法中传递的参数A、StringB、IntegerC、BooleanD、Variant2、以下的选项中能正确表示Java语言中的一个整型常量的是( B )A、12.B、-20 C、1,000 D、4 5 63、下列的变量定义中,正.....

  • java基础覆盖——知识库搭建-1

    一、Java语言的描述 1、1、发展: Sun公司:Oka(基于C和C++)——Java(太平洋盛产咖啡的岛屿名)(1995) 2009.04 Sun公司被Oracle收购   1、2、特点: 1、2、1 面向对象:  封装(用抽象的数据类型将...

  • Java虚拟机(JVM)你只要看这一篇就够了!

    1. Java 内存区域与内存溢出异常 1.1 运行时数据区域 根据《Java 虚拟机规范(Java SE 7 版)》规定,Java 虚拟机所管理的内存如下图所示。 1.1.1 程序计数器 内存空间小,线程私有。字节码解释器工作是...

  • 程序员深度学习!12个View绘制流程高频面试题,大厂直通车!

    Android进阶学习资料库 一共十个专题,包括了Android进阶所有学习资料,Android进阶视频,Flutter,java基础,kotlin,NDK模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码! 大厂面试...

  • 史上最全JVM大全详解!java程序员细节到极致的一次,魔鬼

    当线程结束时,会释放原生线程和 Java 线程的所有资源。即我们常说的永久代(Permanent Generation), 用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据. HotSpot VM把GC分代收集扩展至...

  • Java高级程序员面试集合,请查收

    专题5:Java序列化 1、什么是java序列化,如何实现java序列化? 2、保存(持久化)对象及其状态到内存或者磁盘 3、序列化对象以字节数组保持-静态成员不保存 4、序列化用户远程对象传输 5、Serializable ...

  • Java面试知识点总结

    文章目录java中的数据类型内置数据类型(基本数据类型)关于Integer引用数据类型java中的修饰符关于static面向对象基础多态重写重载隐藏成员变量静态方法Java虚函数、抽象函数、抽象类、接口Java虚函数Java抽象函数...

  • 程序员必知必会:Java 高阶知识点

    Java 1、面向对象的四个基本特征:抽象,封装,继承,多态 抽象:包括数据抽象与行为抽象; 继承:类支持单继承,接口支持多继承 封装:包括重载(overload)和重写(override),前者属于编译型多态,后者属于运行...

  • Java程序员入门:简介

    背景 Go (通常称为“ Golang”)是一种相当新的编程语言,于2007年首次提出,并于2012年推出了1.0版。... Rob Pike与Thompson一起创建了具有影响力的Plan 9操作系统, Robert Griesemer致力于Java HotSpot虚拟机...

  • Java 程序员 面试前必备知识

    Java EE知识点储备 计算机网络 操作系统 数据库相关 XML 常识性知识 总结 前言准备了接近两个月的面试笔试,现在终于是可以休息下了。真真是应了那句老话“台上一分钟, 台下十年功。”。人嘛,越努力,才会越幸运。...

  • Java面试必问!优秀Java程序员必知必会的网络基础

    在Spring Boot中使用Redis实现高并发 Redis是大规模互联网应用常用的内存高速缓存数据库,它的读写速度非常快,据官方Bench-mark的数据,它读的速度能到11万次/秒,写的速度是8.1万次/秒。 首先介绍Redis的原理、...

  • Java工程师必须掌握的JVM知识

    Java必须掌握的JVM知识JVM必备知识(思维导图)1、JVM基本概念1.1、JVM是什么1.2、Java程序运行过程1.3、JDK、JRE、JVM2、JVM内存区域2.1、程序计数器2.2、Java虚拟机栈2.3、本地方法栈2.4、Java堆2.5、方法区(JDK1.8...

  • 10万字208道Java经典面试题总结(附答案)

    JDK(Java Development Kit),Java开发工具包 JRE(Java Runtime Environment),Java运行环境 JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。...

  • 掌握P5级Java面试技巧

    这些书籍包括了基础篇、进阶篇、架构篇的《Java项目实战—深入理解大型互联网企业通用技术》,以及《解密程序员的思维密码--沟通、演讲、思考的实践》。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够...

  • Java 程序员 必备基础知识 温故而知新

    自我介绍数据结构和算法Java篇Java EE知识点储备计算机网络操作系统数据库相关XML常识性知识 总结 前言 准备了接近两个月的面试笔试,现在终于是可以休息下了。真真是应了那句老话“台上一分钟, ...

  • node-v7.7.2-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics