
java
weixin_43887958
这个作者很懒,什么都没留下…
展开
-
cas锁的实现
CPU提供了在指令执行期间对总线加锁 的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK" ,经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。当然,并不是所有的指令前面都可以加lock前缀的,只有ADD, ADC, AND, BTC, BTR, BTS, CMPXCHG,DEC,原创 2021-07-28 16:49:40 · 386 阅读 · 0 评论 -
spring-cloud-gateway 2.x跨域问题
先需要注入一个允许跨域的filter.@Bean public CorsWebFilter corsFilter() { CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedMethod("*"); config.addAllowedOrigin("*"); conf原创 2021-07-22 09:39:14 · 312 阅读 · 0 评论 -
arthas小问题
https://www.shangmayuan.com/a/90608722b13642628af2a371.html转载 2021-06-29 17:47:59 · 83 阅读 · 0 评论 -
es磁盘满了导致的异常
Caused by: org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index read-only / allow delete (api)];]ES所在的系统出现磁盘满了的问题,占用95%的磁盘,删除后已用磁盘空间降至40%,但问题依然存在,需要重新修改一下属性值.解决方法:原创 2021-06-03 19:16:21 · 1629 阅读 · 0 评论 -
mybatis-plus autoResultMap的小问题
PersonMapper.java: @Select("select * from person limit 1") Person get();Person.java:@TableName(value = "t_person", autoResultMap = true)@Datapublic class Person { @TableId private String id; private String name; @TableField(t原创 2021-05-11 12:11:12 · 3386 阅读 · 0 评论 -
java泛型
比如有一个类Base和泛型Textendsextends的前面可以是 ?,Textends的后面可以是T,Base? extends T? extends BaseT extends KT extends Base??只能在super和extends的最前面? extends T? extends Base? super T? super Basesupersuper的前面只能是?super的后面可以是T,Base? super T? super Base&这原创 2021-04-02 18:12:23 · 69 阅读 · 0 评论 -
synchronized和ReentrantLock
这两者的性能是差不多的,当只有一个线程访问时,也就是没有竞争时,相当于没有锁.当有多个线程竞争时,synchronized引入轻量级锁,使用自适应自旋,即根据以往的自旋等待时能否获取到锁,来动态调整自旋的时间,在这个时间段没获取到锁就要变为重量级锁,重量级锁就是没获取到锁时就会由系统内核挂起,获取到锁又系统内核唤醒,比较耗费资源.而ReentrantLock在阻塞前会调用2~3次cas操作尝试获取锁,获取失败就会由LockSupport.park()挂起,也是系统内核挂起,比较耗费资源.个人认为syn原创 2021-03-29 18:06:26 · 84 阅读 · 0 评论 -
ReentrantLock公平与非公平
公平锁final void lock() { acquire(1);}非公平锁final void lock() { if (compareAndSetState(0, 1)) setExclusiveOwnerThread(Thread.currentThread()); else acquire(1);}公平锁与非公平锁的公平体现在加锁的时候.比如,有10个线程在等待,一个线程在工作,等到这个线程完成后,10个等待线程中的第一个会被唤醒,唤醒后该线程去获取锁,这个时候如果原创 2021-03-29 17:08:00 · 120 阅读 · 0 评论 -
2021-03-26
一个数a%32 = 1,那么a%64=1+32 或者 a%64=1,只有这两种情况.因为 a = 32*b+1,如果b为奇数,那么a%64=1+32,如果b为偶数,那么a%64=1.在红黑树中,红黑树是个二叉搜索树,一个节点左边的都比这个节点小,右边的都比这个节点大,...原创 2021-03-26 19:22:09 · 67 阅读 · 0 评论 -
2021-03-25
1.REDIS集群普通hash算法:假设有3台master主机,所有键值对的hash值取值范围为30000(具体是多少不清楚),那么用第k台机器的所有键值就是10000*(k-1) ~ 10000*k。一旦有一个机器挂掉,那么去获取hash值为200时,就会去第(200%(3-1))=0个机器上去,显然是去不到的,因为它本来是存在第(200%3)=2个机器上。一致性hash算法:假设有3台master主机,所有键值对的hash值取值范围为30000(具体是多少不清楚)。分布如下图。A节点的hash值为原创 2021-03-25 19:05:28 · 81 阅读 · 0 评论 -
rocketmq事务
Rocketmq分布式事务,分为两个阶段:prepare: 1生产者产生一个’’预生产’’消息,一般会建一个transaction表记录所有的事务消息,该消息会有一个唯一的transaction_id:失败:事务回滚.2 将’’预生产’’消息发送至mq:失败:事务回滚.3 mq收到’’预生产’’消息,发送确认信息给生产者:失败:’’预生产消息’’并不会被消费者看见,也就无法消费,过段时间就被删除掉了,生产者也无法进行下一步,生产者事务回滚.4 生产者收到了确认消息,进行生产事务,生产出一个产品:失败原创 2021-03-25 19:02:51 · 113 阅读 · 0 评论 -
建造者模式-变种
该变种建造者可以强制用户按照某个顺序建造,并且防止了缺少字段缺点:在必需的字段必须建造一个类public static void main(String[] args) { User user = User.builder() .age(10) .name("zhaojin"); System.out.println(user); } @Data public static clas原创 2021-03-25 18:30:08 · 105 阅读 · 0 评论 -
EnumSet
EnumSet是一个抽象类.它的实现类有两个RegularEnumSet,JumboEnumSet.当创建EnumSet时,会根据传入值的枚举类型获取该枚举类型的所有值并缓存下来,并根据该枚举类型的所有数量判断该创建RegularEnumSet还是JumboEnumSet,数量<=64创建RegularEnumSet,>64就创建JumboEnumSet.RegularEnumSet该类用一个long值保存了所有的枚举类型,因为long是64位,也就是可以放64个0或者1,0表示不存原创 2021-03-25 17:14:35 · 64 阅读 · 0 评论 -
spring bean的初始化
new Bean();调用@autowired的setter方法执行@PostConstruct注解的方法执行InitializingBean的实现方法执行bean指定的initMethod方法原创 2021-03-25 15:02:23 · 56 阅读 · 0 评论 -
rocketmq发送消息,保存消息,获取消息
上图是大概的流程.发送消息producer发送消息时从namesever获取该消息topic的所有messageQueue,从这些messageQueue中随机抽取一个发送,当然也可以指定一个发送,broker给一个响应这样可以保证消息的有序性,因为只有一个messageQueue保存了该topic下的所有消息,而且消费者消费的队列是固定的.就算这个消费者宕机了,来接手这个messageQueue的新消费者也是从这个messageQueue一个一个取出来的,不用担心顺序会乱.如果broke.原创 2021-03-24 16:58:34 · 299 阅读 · 0 评论 -
mybatis的${}和#{}
${}${}在组装sql前将里面的表达式计算出来,举例子:select * from t_user where count=${list.size}在创建preparedStatement前就将${list.size}计算出来了,假设计算值为10,则会将sql = "select * from t_user where count=10" 放入preparedStatement对象中.#{}${}在组装sql后将里面的表达式计算出来,举例子:select * from t_user wh原创 2021-03-23 17:22:41 · 183 阅读 · 0 评论 -
ByteBuffer的基本用法
属性:position,limit,capacity,意思分别是(读/写)位置,结束位置,容量.ByteBuffer bf = ByteBuffer.allocate(10)上述代码分配了十个字节的ByteBuffer,此时position=0,limit=capacity=10bf.put("nihao".getBytes());放入5个字节,此时position=5,limit=capacity=10bf.flip();从写模式切换到读模式,此时position=0,limit=原创 2021-03-18 15:01:09 · 273 阅读 · 1 评论 -
java顺序写的理解
顺序写的本质其实不是"顺序"写,而是内存映射,在rocketmq中,每个commitlog的大小都是固定的,比如是128m,那么在操作这个commitlog时就可以使用内存映射将整个文件映射进内存,就算rocketmq只产生了一条消息,这个commitlog的大小也是128m,只是用做了一个标记,标记下次写入消息到这个commitlog时从哪里开始写入.如果不固定大小的话,内存映射的时候就无法确定结束位置. // 文件上一次写的位置 private static int lastIndex;原创 2021-03-16 20:55:49 · 727 阅读 · 6 评论 -
LongAdder的理解
LongAdderLongAdder继承自Striped64,Striped64有一个内部类Cell以及该类的数组,还又有一个字段叫base,base就是初始值.CellCell内部有一个字段value,该字段是对base值的增加值,就是当多个线程访问LongAdder时,会给该线程分配一个Cell,分配方式为cells[ThreadLocalRandom.current()%cells.length],然后让该线程的修改用cas操作放在该Cell的中value中,cells的初始长度为2,原创 2021-03-12 11:22:02 · 197 阅读 · 1 评论 -
static静态块使用多线程的问题
情况1: 在写静态代码块时,不注意的话会造成死锁.public class MyTest { static class A{ static { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } B.test();/原创 2021-03-05 15:43:35 · 955 阅读 · 0 评论