JAVA问题记录
文章平均质量分 59
丁丁丁冲鸭丶
博客园同名
展开
-
系统架构变迁——个人成长路线
想法雏形某普通大学CS专业的小丁,经常在表白墙qq群里淘各种二手产品,可是每次打开群都会99+,每次都看不到之前别人发了什么东西,要是有一个和淘宝一样的平台来校内交易就好了,哎!小丁想到:“我自己就是计算机专业的啊,我可以做,可是都类应用我不会做啊,我只会在C语言的黑框框里输出烫烫烫烫烫烫烫烫口。”于是乎,这个念头就在藏在了小丁的脑海中。他不知道的是,这就是需求的产生。系统基础架构后来,学习了Java,了解了j2ee,小丁豁然开朗,自己可以做一个web程序!于是自学Javaweb,用servlet和原创 2021-09-07 19:38:04 · 214 阅读 · 0 评论 -
Java锁的分类
1 公平锁 / 非公平锁1.1 公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。1.2 非公平锁非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。1.3 Java实例// ReentrantLock初始化参数为true 即为公平锁private static Lock lock = new ReentrantLock(true);public ReentrantLock(boolean fair) {原创 2021-09-04 17:30:55 · 181 阅读 · 0 评论 -
Java容器线程安全源码探究
我们经常听说这个容器是线程安全的,那个是不安全的,那到底为什么一些是安全的一些是不安全的呢,我们将从源码来查看。线程安全线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。—百度百科Java容器依赖图(基础)ListVector 同步/*** Vector类实现了一个动态数组。和ArrayList和相似,但是两者是不同的:* Vector是同步访问的。*原创 2021-09-01 11:28:52 · 215 阅读 · 0 评论 -
Java动态代理Proxy.newProxyInstance源码到底干了什么?【2021-8-31】
动态代理用一个简单的例子来描述动态代理,你想租房子,一般的话,你需要四处找房子,很辛苦,你想在家躺着交了钱就行,所以你找了个代理(中介),代理去找好了房子,和房东商量,你过来看下房子签合同交钱就好了。这就是代理的作用。(找中介需谨慎,中介不同于代码,代码不会骗人)实际代码中,当你有一个已有的方法,你在不希望修改它的前提下想要扩展它的功能,即可使用动态代理。典型案例就是Spring AOP。例子代码/** * @author ddd * @create 2021-06-25 19:21 *原创 2021-08-31 10:30:04 · 1167 阅读 · 1 评论 -
FutureTask+Callable+ExecutorService实现异步返回值源码
上文中,我们说了ExecutorService运行Runnable和Callable的原理https://blog.csdn.net/dhdhsff/article/details/119984090现在我们来说一下FutureTask+Callable+ExecutorService完成异步返回值的原理使用代码例子package My.ThreadExcutorService;import com.google.common.util.concurrent.ThreadFactoryBuilde原创 2021-08-30 10:21:46 · 411 阅读 · 1 评论 -
ExecutorService和ThreadPoolExecutor运行原理
为什么要使用线程池服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的。构建服务器应用程序的一个过于简单的模型应该是:每当一个请求到达就创建一个新线程,然后在新线程中为请求服务。实际上,对于原型开发这种方法工作得很好,但如果试图部署以这种方式运行的服务器应用程序,那么这种方法的严重不足就很明显。每个请求对应一个线程(thread-per-request)方法的不足之一是:为每个请求创建一个新线程的开销很大;为每个请求创建新线程的服务器在创建和销毁线程上花费的时间和消耗的系统资原创 2021-08-29 20:06:56 · 1412 阅读 · 6 评论 -
SpringBoot使用Redission完成分布式锁
需要导入的依赖/*需要的依赖 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.12.0</version> </dependency> <dependency>原创 2021-07-19 15:06:44 · 185 阅读 · 0 评论 -
Java问题记录:synchronized详解
在Java里面,最基本的互斥同步手段就是synchronized关键字,这是一种块结构(Block Structured)的同步语法。synchronized关键字经过Javac编译之后,会在同步块的前后分别形成 monitorenter和monitorexit这两个字节码指令。这两个字节码指令都需要一个reference类型的参数来指明 要锁定和解锁的对象。如果Java源码中的synchronized明确指定了对象参数,那就以这个对象的引用作 为reference;如果没有明确指定,那将根据synch原创 2021-07-19 14:32:27 · 152 阅读 · 0 评论 -
JAVA问题记录:volatile详解
在读了《深入理解Java虚拟机》一书后,终于弄清楚了volatile的原理主内存和工作内存 Java内存模型的主要目的是定义程序中各种变量的访问规则,即关注在虚拟机中把变量值存储到 内存和从内存中取出变量值这样的底层细节。此处的变量(Variables)与Java编程中所说的变量有所区 别,它包括了实例字段、静态字段和构成数组对象的元素,但是不包括局部变量与方法参数,因为后 者是线程私有的,不会被共享,自然就不会存在竞争问题。为了获得更好的执行效能,Java内存模 型并没有限制执行引擎使用处理器的特定原创 2021-07-16 16:59:17 · 94 阅读 · 0 评论 -
JAVA问题记录:List与Map
/* transient Object[] elementData; // non-private to simplify nested class access ArrayList<>() 底层原理是数组 */ List<Integer> list=new ArrayList<>(); /* private static class Node&...原创 2021-07-16 14:44:58 · 63 阅读 · 0 评论 -
JAVA问题记录:为什么使用消息队列而不是用多线程
二者如何选择,又该在什么情况下使用 因为多线程会消耗当前服务器资源,根本不算加快系统的性能,如果线程挂掉,那线程中的信息仍然会丢失,消息队列可部署在其他中间件上,并且其中的信息可以额外保存。 在一个方法中,前后两段步骤没有联系,互不干扰,即可采用多线程,如:1.先查询A,再查询B,再根据A,B结果修改C,即可使用带返回值的线程同时操作A和B,结果都返回后再修改C,其中操作还有什么细节,暂不讨论。 邮件任务:1.发邮件2.库存修改3.流量削峰4.应用解耦等等...原创 2021-07-16 14:39:31 · 674 阅读 · 0 评论 -
Java问题记录:为什么变量要分基本类型和引用类型
个人理解 首先JAVA是一门面向对象语言,那它本可以将所有变量都用类来保存,但是它本没有这样做,还是保留了八个基本类型。 那了解过JVM虚拟的朋友会知道,运行时的基本变量会放在运行栈内,对象类型变量会存在堆内而只在栈内放一个引用地址,结合我们操作系统以及计算机组成原理的知识,内存和磁盘交互会因为IO速度不匹配而采用高速缓存来过渡,这其中又会涉及到缓存的置换策略与命中率,而且对象类型变量会因为存储的是引用地址,又会多一个地址解析的过程。并且对象类变量在编译后会带有对象头属性,里面有很多标志信息会很占空原创 2021-07-16 14:28:31 · 317 阅读 · 0 评论