![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 68
Forward233
砥砺前行,不忘初心
展开
-
线程安全的计数器限流
网上的代码实现的计数器限流基本都不是线程安全的,如下限流器的实现:设定时间内允许通过设置的请求数public class CountLimitNotSafe { /** * 计数器归零 */ private final AtomicLong ZERO = new AtomicLong(0); /** * 计数器 */ private AtomicLong counter = ZERO; /** * 起始时间原创 2021-02-01 09:44:23 · 369 阅读 · 1 评论 -
Java反射原理总结
反射是Java 中非常重要的特性,它允许正在运行的Java程序观测,甚至是修改程序的动态行为。例如:我们可以通过Class 对象枚举出该类所有方法,我们还可以通过Method.Accessible 绕过Java 语言的访问权限,在私有的方法所在类之外的地方调用该方法。在Java 开发环境(IDE)中当我们输入对象后输入点号时,编译器会根据点号前的数据动态的展示出对象中的属性和方法。在Web开发中,我们经常使用的各种通用框架为了保证框架的可扩展性,往往都使用Java反射功能,根据配置文件中的信息来动态的原创 2021-01-28 07:54:52 · 605 阅读 · 0 评论 -
Java内省与反射
反射机制反射机制的优点:可以实现动态的创建对象和编译,使代码更加灵活多变,比如动态代理的实现,就是通过反射来实现代理方法的代用,比如mybatis查询生成的entity,数据就是通过反射set进去的反射机制的缺点:对性能的影响。使用反射机制基本上是一种解释操纵,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。内省机制什么是内省机制(或者说使用内省机制的好处):内省的出现有利于了对类对象属性的操作,减少了代码的数量,提高代码的可读性。在计算原创 2021-01-24 05:22:46 · 360 阅读 · 0 评论 -
JVM Happens-Before 先行发生原则
JVM先行发生原则如果Java内存模型中所有的有序性都仅靠volatile和synchronized来完成, 那么有很多操作都将会变得非常啰嗦, 但是我们在编写Java并发代码的时候并没有察觉到这一点, 这是因为Java语言中有一个“先行发生”(Happens-Before) 的原则。 这个原则非常重要, 它是判断数据是否存在竞争, 线程是否安全的非常有用的手段。 依赖这个原则, 我们可以通过几条简单规则一揽子解决并发环境下两个操作之间是否可能存在冲突的所有问题, 而不需要陷入Java内存模型苦涩难懂的定原创 2020-12-27 12:44:28 · 236 阅读 · 0 评论 -
Redisson分布式锁实现原理
在了解分布式锁具体实现方案之前,我们应该先思考一下使用分布式锁必须要考虑的一些问题。互斥性:在任意时刻,只能有一个进程持有锁。防死锁:即使有一个进程在持有锁的期间崩溃而未能主动释放锁,要有其他方式去释放锁从而保证其他进程能获取到锁。加锁和解锁的必须是同一个进程。锁的续期问题。常见的分布式锁实现方案基于 Redis 实现分布式锁基于 Zookeeper 实现分布式锁本文采用第一种方案,也就是基于 Redis 的分布式锁实现方案。Redis 实现分布式锁主要步转载 2020-12-22 10:47:46 · 549 阅读 · 0 评论 -
JVM synchronized锁升级
目录一,对象头1,Mark Word2,指向类的指针3,数组长度二,实例数据三,对齐填充字节Java对象保存在内存中时,由以下三部分组成:1,对象头2,实例数据3,对齐填充字节一,对象头java的对象头由以下三部分组成:1,Mark Word2,指向类的指针3,数组长度(只有数组对象才有)1,Mark WordMark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。Ma转载 2020-10-23 10:21:12 · 646 阅读 · 0 评论 -
为什么说java里面只有值传递?
七年前,我从温和湿润的苏州回到古色古香的洛阳,抱着一幅“天下我有”的心态“约谈”了几位面试官。其中有一位叫老马,让我印象深刻。因为他当时扔了一个面试题把我砸懵了:说说 Java 到底是值传递还是引用传递吧。我当时年轻气盛,自认为所有的面试题都能对答如流,没想到被老马“刁难”了——原来洛阳这块互联网的荒漠也有技术专家啊。现在回想起来,脸上不自觉地就泛起了羞愧的红晕:当时真菜!刚好题主也在问这个问题,那我就来好好回答一下。将参数传递给方法有两种常见的方式,一种是“值传递”,一种是“引用传递”。C 语言本身只转载 2020-09-28 17:19:10 · 251 阅读 · 0 评论 -
Java大量定时任务,如何优化
一、缘起很多时候,业务有定时任务或者定时超时的需求,当任务量很大时,可能需要维护大量的timer,或者进行低效的扫描。例如:58到家APP实时消息通道系统,对每个用户会维护一个APP到服务器的TCP连接,用来实时收发消息,对这个TCP连接,有这样一个需求:“如果连续30s没有请求包(例如登录,消息,keepalive包),服务端就要将这个用户的状态置为离线”。其中,单机TCP同时在线量约在10w级别,keepalive请求包大概30s一次,吞吐量约在3000qps。一般来说怎么实现这类需求呢?“轮原创 2020-09-24 04:56:20 · 6316 阅读 · 2 评论 -
Java的Scanner中关于next()、nextLine()、hasNext()、hasNextLine()的说明
java.util.Scanner 是 Java5 的新特征,用于从键盘输入内容,读取到程序当中。next() 与 nextLine() 区别next():一定要读取到有效字符后才可以结束输入。对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。next() 不能得到带有空格的字符串。nextLine()...原创 2019-12-14 18:20:40 · 7960 阅读 · 4 评论 -
HashMap的长度为2的n次方
HashMap的容量长度为2的n次方原因总结:HashMap存取时,都需要计算当前key应该对应Entry[]数组哪个元素,即计算数组下标;算法如下: /** * Returns index for hash code h. */ static int indexFor(int h, int length) { return h & ...原创 2019-02-26 14:06:40 · 362 阅读 · 0 评论 -
如何将Java中的byte转为protobuf中bytes
Java中的byte转为protobuf中bytes 在protobuf中如果定义了bytes类型的消息传输对象 syntax = "proto3"; option java_package="com.test.protobuf"; option java_outer_classname = "NettyMessage"; mess原创 2019-01-19 14:19:30 · 10611 阅读 · 2 评论 -
Java 子类构造方法与父类构造方法的问题
子类带参构造方法与父类构造参数的问题看一段代码class Base{ public Base(String s){ System.out.print("B"); }}public class Derived extends Bas原创 2018-12-12 13:53:58 · 673 阅读 · 2 评论