Maps.newHashMapWithExpectedSize(1);创建固定长度的map;……

阅读全文

面试官:讲一下CAS - CAS(Compare And Swap),比较并交换。整个AQS同步组件,Atomic原子类操作等等都是基于CAS实现的,甚至ConcurrentHashMap在JDK1.8版本中,也调整为CAS+synchronized。可以说,CAS是整个JUC的基石。 CAS的实现方式其实不难。在CAS中有三个参数:内存值V、旧的预期值A、要更新的值B,当且仅当内存值V的值等于旧的预期值A时,才会将内存值V的值修改为B,否则什么也不干,是一种乐观锁。 举了个AtomicInteger的例子,来给面试官阐述CAS的实现。 面试官:那CAS有什么缺陷吗? 我:CAS虽然高效的解决了原子问题,但是还是存在一些缺陷的,主要体现在三个方面: 1.循环时间太长: 如果自旋CAS长时间不成功,则会给CPU带来非常大的开销,在JUC中,有些地方就会限制CAS自旋的次数。 2.只能保证一个共享变量原子操作: 看了CAS的实现就知道这只能针对一个共享变量,如果是多个共享变量就只能使用锁了。或者把多个变量整成一个变量也可以用CAS。 3.ABA问题: CAS需要检查操作值有没有发生改变,如果没有发生改变则更新,但是存在这样一种情况:如果一个值原来是A,变成了B,然后又变成了A,那么在CAS检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的ABA问题。对于ABA问题的解决方案是加上版本号,即在每个变量都加上一个版本号,每次改变时加1,即A->B->A,变成1A->2B->3A。例如原子类中AtomicInteger会发生ABA问题,使用AtomicStampedReference可以解决ABA问题。 面试官:你能说下轻量级锁吗? 面试官:你先说下你对synchronized的了解。 面试官:什么是原子操作? 面试官:什么是Executors框架? 面试官:什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型? 面试官:CycliBarriar和CountdownLatch有什么区别? 面试官:Java中用到的线程调度算法是什么?……

阅读全文

1.java进程快照 java -v 获取进程号 jstack -F 进程号 >> jstack.txt 2.获取内存快照 利用 jmap 生成堆转储快照,命令: jmap -dump:format=b,file=heapdump.hprof {pid} heapdump.hprof文件 mat(memory analyzer tool)……

阅读全文

1 Dubbo 1.1 服务调用超时问题怎么解决? 1.2 Dubbo支持哪些序列化方式? 1.3 Dubbo和SpringCloud的关系? 1.4 Dubbo的架构设计?一共划分了哪些层? 1.5 Dubbo的默认集群容错方案? 1.6 Dubbo使用的是什么通信框架? 1.7 Dubbo的主要应用场景? 1.8 Dubbo服务注册与发现的流程?流程说明。 1.9 Dubbo的集群容错方案有哪些? 1.10 Dubbo的四大组件 1.11 Dubbo在安全机制方面是如何解决的 1.12 Dubbo和SpringCloud的区别? 1.13 Dubbo支持哪些协议,每种协议的应用场景,优缺点? 1.14 Dubbo的核心功能有哪些? 1.15 Dubbo的注册中心集群挂掉,发布者和订阅者之间还能通信么? 1.16 Dubbo集群的负载均衡有哪些策略 1.17 为什么需要服务治理? 1.18 Dubbo超时时间怎样设置? 2 ElasticSearch 2.1 你们公司的ES集群,一个node一般会分配几个分片? 2.2 Elasticsearch是如何实现Master选举的? 2.3 你是如何做写入调优的? 2.4 如何避免脑裂? 2.5 19-Elasticsearch对于大数据量(上亿量级)的聚合如何实现? 2.6 ES主分片数量可以在后期更改吗?为什么? 2.7 如何监控集群状态? 2.8 ElasticSearch中的副本是什么? 2.9 20.ES更新数据的执行流程? 2.10 shard里面是什么组成的? 2.11 ElasticSearch中的分析器是什么? 2.12 什么是脑裂? 2.13 客户端在和集群连接时,如何选择特定的节点执行请求的? 2.14 Elasticsearch中的倒排索引是什么? 2.15 什么是索引?索引(名词) 一个索引(index) 2.……

阅读全文

Tim Qian A full-stack JS developer and open-source activist. Contact | GitHub | Twitter | Email | Website | Blog | Patreon | Teck Stack Backend: Node.js; Express; AWS lambda; serverless; GraphQL; RabbitMQ Database: DynamoDB; MongoDB; Postgres; SQLite; AWS RDS; Redis Frontend: react.js; SASS/CSS; d3.js Chrome Extension: react.js; SASS/CSS; Projects (open source) chart.xkcd: xkcd styled chart lib. 5.5k+ stars on GitHub, 100k downloads Built with d3.……

阅读全文

#RSA+AES混合加解密流程(java实现) ##前言 - AES128 - 密钥长度:16位 - 算法/模式/补码方式:AES/ECB/PKCS5Padding - 生成字节码后用Base64转码成字符串 - RSA1024 - 密钥格式:PKCS#8 - A私钥: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANgzOg6jy2eiAFmw/E9zC2zRCpPWIvN7YKkjDFMt8g3besq0eau3d+7ktXAX4c3qXp7TFXdTQsjV2d354+T3/mTBkXLVHHCLaucgS9+cl6k7BJCcHE5jOEDx4jLqeOKF474xSIz7v0WhrlxFMl7XDXpDhka4clH1IdStHbvqjoODAgMBAAECgYEAwumMEd7BZnC6+CGDlu0VA8mCS73mTLSSdGnQlrz5WFzi2xTSDGmfipROrvwY6te87ltHIwjBUObbQDAlsSuTAAI2tnkFt57G7DXuYnYAufknT21z6CoLVJdiDt57kk+Num2wVQiSxWNVfDx+A/UUPQ7+/HfmHwC+QcEhDCfyB6ECQQD6CtI4nUIJOBPrnwhJZo+Yw54VOu1y5Z8+xxIkPqYfxtR9LE3v43SdVmC2bfEpHj3UwfiOpQI2BQ1JFigtOQu1AkEA3Vn6pfnmyioK3rxMhGqEyOoHUjI9QzhqVPN7T3r/2OXO6XYY2CSd2JHe89nLweY27LZ+oFYp87UTPCfTM80FVwJAJVzyltUg5gHEMEQ+V8GEmZ45hBCfJLkdN6NFmbbm2f67B81UBBGn/k7G+tuo2q0TLjSh8KbFks7kclRmQoOwtQJAezYaz0jLrry4UEOAVDT2tN+QM7DDaSd+CMt/WD6fK5zAEDQsoCPBuUt5T0NsqAH9kMYEtjtAHugsTM/eQHdfAQJAN7Sy0yXah/5RZ8oZe1bx8+XPt7R3ca6kRQtXP7NpEMI/lOuU8TAZRw7Ckj+C5lPZLu8WvEIPjtDQ4yTvvEJHiw== - A公钥: ``` MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYMzoOo8tnogBZsPxPcwts0QqT1iLze2CpIwxTLfIN23rKtHmrt3fu5LVwF+HN6l6e0xV3U0LI1dnd+ePk9/5kwZFy1Rxwi2rnIEvfnJepOwSQnBxOYzhA8eIy6njiheO+MUiM+79Foa5cRTJe1w16Q4ZGuHJR9SHUrR276o6DgwIDAQAB ``` - B私钥: ``` MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANCyrNMoq9QWMNim0l5XnCWfnpXHnO2AQJvt4ygugjXah8xTBdJ6N1N0rFzmw1CDN1qwJJ5X6DhJs1l3PUkzIp6/wJPl9ht55DJiqC40GvRA78gJJD4g/KQMS3t4F4xZhQpFsu9Tha8gHIACXoM05+A34qLzUvxBkFUdssjHFStPAgMBAAECgYAdMrJNRKZtoMEqvoQ2IMm+1cspJ2lELSpc5nZee8tJ344aPw9UeDbfXTZ0NPDkhccrz/L/mErr/Ruzi6QuZpIUJQTIbTlcDb1I0d/Hi7W/rkY+3Y/vBfYBPTdORhQ866LdjD84DVnP8wphcR8rnKL4H/8uYC12W+TI2nlRVIassQJBAO/0LYsSvGYNDLVMQZXjcIgPqSjheMRZHpRm+w0NdQvytJlqqAJOy+gIGeQu3fF4n/sgGdVpPcAdAGzDsCIjk4kCQQDep2vMnOvK2QCRHXSFDXSzUkhCUnIbXFHBBzh8KwluIexFblNOl/xLpHs9TM04+ei8ir2f6fPZ5chbcAl87xoXAkBrgwh066wmPWqYQNaSBhoBnKK6gmvN7fBZpdqOep0bAWAR7Uvh3NRX3mlbZ/RhoR5tMnDgwgq87UGnefaNFUuhAkBr86KJhz+vjvz+Xtiitf5x/x/3v/+BEoa03ypc0YT1986Vb0NG5Nu3VR1HgFg0Gr7jwyTjRswrRoSZCL4g69CrAkEA2e3Qxql488djYd+aH+BBuD1TBJtwMZflPf9vCr4hlMw9aYOR6/BtDGdT2XEi+uyQGPOXjbozf96+WDreyFkQhQ== ``` - B公钥: ``` MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQsqzTKKvUFjDYptJeV5wln56Vx5ztgECb7eMoLoI12ofMUwXSejdTdKxc5sNQgzdasCSeV+g4SbNZdz1JMyKev8CT5fYbeeQyYqguNBr0QO/ICSQ+IPykDEt7eBeMWYUKRbLvU4WvIByAAl6DNOfgN+Ki81L8QZBVHbLIxxUrTwIDAQAB ``` 假设要加密的数据为:{“a”:“1”} 加密签名 第一步:生成随机AES128密钥 String aesRandomKey = EncryptUtil.getAesRandomKey(); //假设生成的密钥为:a7ab6ac42c20d747 第二步:将需要加密的数据进行AES128加密 String data = "{\"a\":\"1\"}"; String data2Aes = EncryptUtil.encryptByAES(data2Aes,aesRandomKey); //使用随机AES密钥a7ab6ac42c20d747加密data后得到数据: //data2Aes=ag5nOGqwFa75tYBiwHB8hA== 第三步:将生成的随机AES128密钥用RSA方式加密 String randomKey = EncryptUtil.encryptByRSA(aesRandomKey, publicKeyB); //得到用RSA加密后的randomKey: //w+glUqi5+RLkeWGNXP9SlVN7LmIa8Vi/EIKz/DUNHS6sfo6uDVssaCNDysOFpA0XhKRz28tIZ4p1eWmM3pOXDD9qXCi4PscRRlrPPA9njgigpvdm1sFLtEObr5CDBsKn/+XIsSZJ/8u9ZP33q6bw8yGRsfekD0FHSw4SsVEGs+Y= 第四步:将timesTamp、data2Aes、randomKey用A私钥签名 //例如:timesTamp=1609753530 //data2Aes=ag5nOGqwFa75tYBiwHB8hA== //randomKey=w+glUqi5+RLkeWGNXP9SlVN7LmIa8Vi/EIKz/DUNHS6sfo6uDVssaCNDysOFpA0XhKRz28tIZ4p1eWmM3pOXDD9qXCi4PscRRlrPPA9njgigpvdm1sFLtEObr5CDBsKn/+XIsSZJ/8u9ZP33q6bw8yGRsfekD0FHSw4SsVEGs+Y= //生成的签名串为(字典排序): //linkStr="data=ag5nOGqwFa75tYBiwHB8hA==&randomKey=w+glUqi5+RLkeWGNXP9SlVN7LmIa8Vi/EIKz/DUNHS6sfo6uDVssaCNDysOFpA0XhKRz28tIZ4p1eWmM3pOXDD9qXCi4PscRRlrPPA9njgigpvdm1sFLtEObr5CDBsKn/+XIsSZJ/8u9ZP33q6bw8yGRsfekD0FHSw4SsVEGs+Y=&timesTamp=1609753530" //生成签名的方法: String sign = EncryptUtil.……

阅读全文