- 博客(32)
- 收藏
- 关注
原创 一个线程两次调用start()方法会出现什么情况
Java 的线程是不允许启动两次的,第二次调用必然会抛出 IllegalThreadStateException,这是一种运行时异常,多次调用 start 被认为是编程错误。在第二次调用 start() 方法的时候,线程可能处于终止或者其他(非 NEW)状态,但是不论如何,都是不可以再次启动的。
2024-04-27 16:33:44
283
原创 synchronized和ReentrantLock有什么区别
所谓锁的升级、降级,就是 JVM 优化 synchronized 运行的机制,当 JVM 检测到不同的竞争状况时,会自动切换到适合的锁实现,这种切换就是锁的升级、降级。当没有竞争出现时,默认会使用偏斜锁。JVM 会利用 CAS 操作(),在对象头上的 Mark Word 部分设置线程 ID,以表示这个对象偏向于当前线程,所以并不涉及真正的互斥锁。这样做的假设是基于在很多应用场景中,大部分对象生命周期中最多会被一个线程锁定,使用偏斜锁可以降低无竞争开销。
2024-04-27 16:32:21
272
原创 设计模式介绍
创建型模式,是对对象创建过程的各种问题和解决方案的总结,包括各种工厂模式(Factory、Abstract Factory)、单例模式(Singleton)、构建器模式(Builder)、原型模式(ProtoType)。 结构型模式,是针对软件设计结构的总结,关注于类、对象继承、组合方式的实践经验。常见的结构型模式,包括桥接模式(Bridge)、适配器模式(Adapter)、装饰者模式(Decorator)、代理模式(Proxy)、组合模式(Composite)、外观模式(Facade)、享元模式(Fly
2024-04-27 16:29:10
264
原创 谈谈接口和抽象类有什么区别
除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。我们在日常开发中,因为无意间暴露了细节导致的难缠 bug 太多了,比如在多线程环境暴露内部状态,导致的并发修改问题。从另外一个角度看,封装这种隐藏,也提供了简化的界面,避免太多无意义的细节浪费调用者的精力。但要注意,继承可以看作是非常紧耦合的一种关系,父类代码修改,子类行为也会变动。
2024-04-27 16:27:02
318
原创 Java有几种文件拷贝方式?哪一种最高效?
于 NIO transferTo 的实现方式,在 Linux 和 Unix 上,则会使用到零拷贝技术,数据传输并不需要用户态参与,省去了上下文切换的开销和不必要的内存拷贝,进而可能提高应用拷贝性能。注意,transferTo 不仅仅是可以用在文件拷贝中,与其类似的,例如读取磁盘文件,然后进行 Socket 发送,同样可以享受这种机制带来的性能和扩展性提高。因为通常的垃圾收集日志等记录,并不包含 Direct Buffer 等信息,所以 Direct Buffer 内存诊断也是个比较头疼的事情。
2024-04-27 16:23:48
369
原创 Java提供了哪些IO方式? NIO如何实现多路复用
首先,传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式。
2024-04-27 16:07:26
256
原创 对比Hashtable、HashMap、TreeMap有什么不同
TreeMap 则是基于红黑树的一种提供顺序访问的 Map,和 HashMap 不同,它的 get、put、remove 之类操作都是 O(log(n))的时间复杂度,具体顺序可以由指定的 Comparator 来决定,或者根据键的自然顺序来判断。HashMap 是应用更加广泛的哈希表实现,行为上大致上与 HashTable 一致,主要区别在于 HashMap 不是同步的,支持 null 键和值等。实现,本身是同步的,不支持 null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用。
2024-04-27 16:03:31
238
原创 对比Vector、ArrayList、LinkedList有何区别
这三者都是实现集合框架中的 List,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供按照位置进行定位、添加或者删除的操作,都提供迭代器以遍历其内容等。实现,它本身不是线程安全的,所以性能要好很多。与 Vector 近似,ArrayList 也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高 1 倍,而 ArrayList 则是增加 50%。Vector 内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。
2024-04-27 15:58:59
153
原创 java 中的int和Integer有什么区别
Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。
2024-04-27 15:11:07
144
原创 谈谈 Java 反射机制,动态代理是基于什么原理
实现动态代理的方式很多,比如 JDK 自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类似 ASM、cglib(基于 ASM)、Javassist 等。通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装 RPC 调用、面向切面的编程(AOP)。
2024-04-27 15:06:51
476
原创 java 中String、StringBuffer、StringBuilder有什么区别
StringBuffer 本质是一个线程安全的可修改字符序列,它保证了线程安全,也随之带来了额外的性能开销,所以除非有线程安全的需要,不然还是推荐使用它的后继者,也就是 StringBuilder。它是典型的 Immutable 类,被声明成为 final class,所有属性也都是 final 的。StringBuilder 是 Java 1.5 中新增的,在能力上和 StringBuffer 没有本质区别,但是它去掉了线程安全的部分,有效减小了开销,是绝大部分情况下进行字符串拼接的首选。
2024-04-27 15:01:51
208
原创 jvm 中的强引用、软引用、弱引用、幻象引用有什么区别
对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为 null,就是可以被垃圾收集的了,当然具体回收时机还是要看垃圾收集策略。,有时候也翻译成虚引用,你不能通过它访问对象。幻象引用仅仅是提供了一种确保对象被 finalize 以后,做某些事情的机制,比如,通常用来做所谓的 Post-Mortem 清理机制,我在专栏上一讲中介绍的 Java 平台自身 Cleaner 机制等,也有人利用幻象引用监控对象的创建和销毁。它同样是很多缓存实现的选择。
2024-04-27 14:59:27
411
原创 谈谈final、finally、 finalize有什么不同
我们可以使用 try-finally 或者 try-catch-finally 来进行类似关闭 JDBC 连接、保证 unlock 锁等动作。final 可以用来修饰类、方法、变量,分别有不同的意义,final 修饰的 class 代表不可以继承扩展,final 的变量是不可以修改的,而 final 的方法也是不可以重写的(override)。finalize 是基础类 java.lang.Object 的一个方法,它的设计目的是保证对象在被垃圾收集前完成特定资源的回收。
2024-04-27 14:53:23
250
原创 javae 中 Exception和Error有什么区别
不检查异常就是所谓的运行时异常,类似 NullPointerException、ArrayIndexOutOfBoundsException 之类,通常是可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。比如,掌握那些应用最为广泛的子类,以及如何自定义异常等。
2024-04-27 14:52:01
274
原创 多年工作经历 谈谈对Java平台的理解
我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器,JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于。Java 本身是一种面向对象的语言,最显著的特性有两个方面,一是所谓的“
2024-04-27 14:46:42
155
原创 docker网络
docker0是liunx的虚拟网桥 网桥是,应用层,表示层,回话层,传输层,网络层,数据链路层网桥()物理层liunx虚拟网桥的特点:可以设置ip地址相当于拥有一个隐藏的虚拟网卡 ubuntu没有查看网桥管理工具需要先安装,apt-get install bridge-utils之后可以运行brctl show查看网桥设备当docker默认的网段不符合我们的条件时,...
2019-01-06 22:18:33
224
原创 docker教程
与容器交互的方式docker -i -t image /bin/bash-i 始终打开标准的输入输出-t 提供一个ttl的伪终端查看容器docker ps -a -i-a 查看所有-i 查看最新的容器,进程 comment 命令 creates 创建不给ps指定参数,返回的是正在运行的容器查看容器的详细信息docker inspeck 容器id或者容...
2019-01-05 23:24:21
1252
原创 学习虚拟机(jvm)必须知道的东西
我一共写了两篇博客,这一篇是为了让大家头脑清楚,哪些重要,如果谁有不懂得https://blog.csdn.net/weixin_40078053/article/details/80546846这是我的另一篇博客,对虚拟机有详细介绍,当然啦,满满全是干货,总结,否则看虚拟机书有砖头那么厚,看了后面的的忘了前面的。一、运行时数据区域 线程隔离, 线程共享,方法区(运行时常量池)、堆、虚拟机栈、本地...
2018-06-03 00:00:11
3665
原创 虚拟机总结
一、运行时数据区域 线程隔离:线程隔离的意思,就是给不同的线程多分配的资源用,以做到不争用 线程共享:线程共享就是资源只有一个没有办法分配更多,只能共享 Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区。程序计数器,虚拟机栈,本地方法栈,随线程而生,线程亡而亡1.1 程序...
2018-06-02 12:15:19
1752
原创 web介绍
web的三大组件:servlet,filiter,listener。都要在web.xml中配置甚至是dispacherservlet 也要在web.xml中配置 servlet3.0之后用注解搞定一切在servlet中都有springmvc的异步处理:...
2018-05-06 20:48:37
237
原创 tx事物
事物管理器原理扩展原理:构建器。applicationListenrevent:事件是事件不是时间multicast:多路派发可以用这个代替实现接口总结:spring容器的创建过程拦截bean的创建过程总结:这是最基础的spring核心...
2018-05-05 19:18:25
432
原创 AOP注解
spring中很多@enablexxx表示开启什么功能外部类可以用全路径来引用。获取方法名原来在配置文件中:总结:获取参数表自动代理创建器这是后置处理器总结:...
2018-05-05 11:48:46
214
原创 Spring ioc注解原理
annotation:注解@Configuration //告诉Spring这是一个配置类@Bean //给容器中配置一个Bean 类型为返回值类型,id默认是方法名 也可以指定value值@Autowired和@Resource是用来修饰字段、构造函数或者设置方法,并做注入的。//包扫描,只要标注了@controller,@service,@repository...
2018-05-04 16:03:08
983
原创 o2o项目开发二
前言因为我们在idea中创建了一个maven项目,因为是ssm框架,所以最好在项目开始前在pom.xml中导入需要的jar包,1.测试jar包,2.日志jar包 3.spring所需的jar包 4.mybatis的jar包 5.jdbc(数据库连接的jar包)6.mybatis和sprig的整合jar包7.连接池jar包 <!--测试相关的jar包工具--> <depen...
2018-04-24 23:20:41
346
原创 weno2o项目模块介绍
环境配置:apache-maven-3.5.3,本地仓库,阿里云库在配置文件中配好安装jdk1.8.0_162apache-tomcat-8.5.29-windows-x64IntelliJ IDEA 2018.1//它的安装破解就不多讲述了,千万别下载社区版。。。项目开始在idea中创建maven项目,https://www.cnblogs.com/wql025/p/5215570.html,不...
2018-04-21 23:09:17
905
转载 javaweb入门day2 dom
day04总结l DOM的基础n Document对象 // 文件n Element对象 //元素n Node对象 //节点l innerHTMLl 事件处理l 表单验证 上次课内容回顾:JS中ECMAScript用法: JS定义变量:使用var 使用typeof变量类型 JS语句: if语句 switch语句 for while do whil...
2018-04-18 15:41:31
150
转载 javaweb基础第一天
day03总结l JavaScript的基础n JavaScript的变量n JavaScript的数据类型n JavaScript的语句n JavaScript的数组n JavaScript的函数n JavaScript内建对象n JavaScript自定义对象l BOM的基础n Window对象n Navigatorn Screenn History对象n Location对象l DOM的基础...
2018-04-18 15:16:06
195
原创 nginx大结局
Nginx+Lua环境搭建参考http://www.imooc.com/article/19597这个手记搭建Nginx调用lua模块指令灰度发布:先让一部分人体验,防止服务器爆炸安装memcaches:yum install memcache启动memecache memcached -p11211 -u//用户 nobody -d//以守护进程的方式启动想要调用memecache的数据还要加一...
2018-04-16 00:19:41
335
转载 ngnx高级知识
在centos上安装jdk,yum -y list jdk 查看一下,之后yum -y install 查看有的,右击, java -sersion查看安装后的版本安装tomcat 先用 yum search tomcat 查询那些可以安装 动静分离静态资源最好放放在一个目录下,如果不大放在程序目录下通过匹配可以找出哪些是动态访问和静态访问,以jsp,php等结尾的一般为动态资源nginx深度学习...
2018-04-14 00:57:19
855
原创 Nginx进阶二
Nginx中间件配置语法:文件读取sendfile on|off 默认off 现在有一种新的技术-with-file-aio异步文件读取tcp_nopush on|off 默认off 在sendfile开启的情况下,提高网络包的报文传输效率,就是多次请求一次wanctcp_nodelay on|off 默认 on 和nopush对应,在keepalive连接下,提高网络包的传输实时性gzip...
2018-04-12 22:41:26
673
原创 Nginx详细入门到精通笔记一
简介Nginx是高效可靠的http中间件,支持海量的并发请求,稳定开源可靠,代理服务环境调试确认: 1.确认系统网络2.确认yum可用3.确认关闭iptables规则4.确认停用selinux安装调试确认:两项安装: yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake ...
2018-04-11 18:57:33
3369
原创 CacheCloud的入门运用与实战
一,cachecloud是一款提供redis云管理的平台,现在有很多公司运用它进行集群的管理,它实现(redis单机部署,redis sentinel,redis cluster)的自动部署,大大降低了运维的难度,一键式的界面操控。解决了redis的实例碎片化现象,提供了完善的统计,监控,运维功能,减少了运维的成本和误操作,提高机器的利用率,提供灵活的伸缩性,提供方便的接入客户端。下载地址:htt...
2018-04-09 16:37:36
4722
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人