java
文章平均质量分 60
Drizzleeeeee
这个作者很懒,什么都没留下…
展开
-
CAS ABA问题及解决方案示例
CAS ABA问题ABA问题是CAS机制中出现的一个问题,他的描述是这样的。我们直接画一张图来演示,什么意思呢?就是说一个线程把数据A变为了B,然后又重新变成了A。此时另外一个线程读取的时候,发现A没有变化,就误以为是原来的那个A。这就是有名的ABA问题。ABA问题会带来什么后果呢?我们举个例子。一个小偷,把别人家的钱偷了之后又还了回来,还是原来的钱吗,你老婆出轨之后又回来,还是原来的老婆嘛?ABA问题也一样,如果不好好解决就会带来大量的问题。最常见的就是资金问题,也就是别人如果挪用了你的原创 2021-04-04 16:23:16 · 626 阅读 · 3 评论 -
什么是可重入锁?什么是不可重入锁?【代码示例】
不可重入锁示例:public class Lock{ private boolean isLocked = false; public synchronized void lock() throws InterruptedException{ while(isLocked){ wait(); } isLocked = true; } public synchron原创 2021-04-03 23:22:05 · 125 阅读 · 2 评论 -
RestTemplate请求406错误、中文乱码问题
使用RestTemplate请求某第三方API时,当未添加 系统中的convert时会出现406错误,添加了convert后,会出现中文乱码。调查结果:406是因为 该第三方API需要Accept为"text/plain"或*/*或其他的(我不知道他具体要什么),请求头中的中文乱码是当Accept为"text/plain"时响应即为中文乱码。源码跟踪:org.springframework.web.client.RestTemplate.AcceptHeaderRequestCallback#原创 2021-02-25 11:55:23 · 1732 阅读 · 0 评论 -
为什么重写equals()一定要重写hashCode()?
因为hashMap,hashSet等数据结构是依赖hashCode判断两个对象是否是一致的,如重写了equals,不重写hashCode,会有以下问题。运行这段代码发现结果返回的是null。再来看一下HashMap中的get源码:get的时候会先比较hashCode然后再去比较equals, 返回结果为null其实都是hashCode惹的祸。所以重写equals必须重写hashCode。不然在hashMap,hashSet等结构中不能使用。那为什么h...原创 2021-02-22 09:11:13 · 432 阅读 · 0 评论 -
Java Socket编程
前言今天跟大家分享网络编程相关的知识,很简单,可以用来练练手,如果认真看的话依旧会有收获,谢谢大家,感谢大家的阅读原理通过socket套接字实现A(客户端)和B(服务器),A可以发送信息给服务器,服务器接收信息,并返回相应的指示概述:环境:IntelliJ IDEA 2019.3.4语言:Java特点:简单,易懂,效果爆炸展示客户端输入bye则退出代码(具体实现)客户端定义客户端类,添加main函数创建socket,并连接到端口号为2000的本地服务器进程打印客户端和服务器信息原创 2021-02-21 14:27:55 · 134 阅读 · 0 评论 -
浅析五种IO模型(包括IO多路复用)
五种IO模型:同步阻塞IO(Blocking IO):即传统的IO模型。同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK。注意这里所说的NIO并非Java的NIO(New IO)库。IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。异步IO(Asynchronous IO):即经原创 2021-02-21 13:41:08 · 714 阅读 · 1 评论 -
编程规范:为什么boolean类型变量命名禁用is开头
java中,对于非boolean类型的参数,getter和setter方法命名的规范是以get和set开头,如下: private String Success; public String getSuccess() { return Success; } public void setSuccess(String success) { Success = success; } 而对于boolean类型的参数,set...原创 2020-11-25 13:59:37 · 1529 阅读 · 1 评论 -
CAS详解
CAS存在的问题以及解决方案CAS虽然很高效的解决原子操作,但是CAS仍然存在三大问题。ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作ABA问题因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就会变成1A-2B-3A。从Jav原创 2020-11-22 21:10:48 · 208 阅读 · 0 评论 -
Java无锁应对高并发Atomic详解
问题: java多线程有线程安全问题,因为操作非原子,分为三步:1.读主内存的值 2.在工作内存中操作 3.回写到主内存解决方案:操作加锁,在写回主内存前,其他线程不允许更新该方案缺点:重量级锁,性能差优化方案:使用Atomic系列类,如AtomicInteger,其底层调用CPU的CAS(CompareAndSwapInt)指令,先比较是否符合预期,如符合预期更新,不符合预期放弃重试。源码如下:// 封装了一个int对其加减 private volatil...原创 2020-11-21 19:39:16 · 325 阅读 · 0 评论 -
Java进阶:volatile使用详解
概述volatile是Java提供的轻量级的同步机制,保证了可见性,不保证原子性。了解volatile工作机制,首先要对Java内存模型(JMM)有初步的认识:每个线程创建时,JVM会为其创建一份私有的工作内存(栈空间),不同线程的工作内存之间不能直接互相访问 JMM规定所有的变量都存在主内存,主内存是共享内存区域,所有线程都可以访问 线程对变量进行读写,会从主内存拷贝一份副本到自己的工作内存,操作完毕后刷新到主内存。所以,线程间的通信要通过主内存来实现。 volatile的作用是:线程对副原创 2020-11-21 18:55:23 · 160 阅读 · 0 评论