Fork me on GitHub

JUC-18-CAS

JUC-18-CAS

1. 简介

  • CAS(Compare-and-Swap),即比较并替换,是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。CAS也是现在面试经常问的问题,本文将深入的介绍CAS的原理。

[参考博客][https://blog.csdn.net/v123411739/article/details/79561458?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.edu_weight]

2. CAS

2.1 一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.concurrent.CountDownLatch;

public class VolatileTest {

public static volatile int race = 0;

private static final int THREADS_COUNT = 20;

private static CountDownLatch countDownLatch = new CountDownLatch(THREADS_COUNT);

public static void increase() {
race++;
}

public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[THREADS_COUNT];
for (int i = 0; i < THREADS_COUNT; i++) {
threads[i] = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
increase();
}
countDownLatch.countDown();
}
});
threads[i].start();
}
countDownLatch.await();
System.out.println(race);
}
}

我们知道,运行完这段代码之后,并不会获得期望的结果,而且会发现每次运行程序,输出的结果都不一样,都是一个小于200000的数字。

通过分析字节码我们知道,这是因为volatile只能保证可见性,无法保证原子性,而自增操作并不是一个原子操作(如下图所示),在并发的情况下,putstatic指令可能把较小的race值同步回主内存之中,导致我们每次都无法获得想要的结果。那么,应该怎么解决这个问题了?

阅读更多...

计算机网络-04-抓包

计算机网络-04-抓包

前言

1. 抓包的作用

在日常工作中,我们经常会用到抓包工具,看看前后台的数据传输、分析分析协议内容之类的。对于抓包工具在测试中的使用粗略归纳了几点:

1.从功能测试角度,通过抓包查看隐藏字段

  • Web 表单中会有很多隐藏的字段,这些隐藏字段一般都有一些特殊的用途,比如收集用户的数据,预防 C RSF 攻击,防网络爬虫,以及一些其他用途。
    这些隐藏字段在界面上都看不到,如果想检测这些字段,就必须要使用抓包工具。

2. 通过抓包工具了解协议内容,方便开展接口和性能测试

  • 性能测试方面,性能测试其实就是大量模拟用户的请求,所以我们必须要知道请求中的协议内容和特点,才能更好的模拟用户请求,分析协议就需要用到抓包工具;
    接口测试方面,在接口测试时,虽然我们尽量要求有完善的接口文档。但很多时候接口文档不可能覆盖所有的情况,或者因为文档滞后,在接口测试过程中,还时需要借助抓包工具来辅助我们进行接口测试。

3. 需要通过抓包工具,检查数据加密

  • 安全测试方面,我们需要检查敏感数据在传输过程中是否加密,也需要借助抓包工具才能检查。

4. 处理前后端 bug 归属之争

  • 在我们提交bug的时候,经常会出现前端(客户端展示)和后端(服务端的逻辑)的争议,那么 可以通过抓包工具,确实是数据传递问题还是前端显示的问题。如果抓出来的数据就有问题的话,那么一般是后端的问题;如果抓出来的数据是正确的,那么基本上可以断定是前端显示的问题。

5. 通过抓包分析,可以更好的理解整个系统

  • 经常使用抓包工具辅助测试,可以很好的了解整个系统,比如数据传输过程前后端的关系,以及整个系统的结构。特别是对现在的微服务架构的产品,抓包能够更好的梳理和掌握整个系统各个服务之间的关系,大大增加测试的覆盖度。另外还可以增进对代码、HTTP协议方面知识的理解。
阅读更多...

计算机网络-03-传输层

计算机网络-03-传输层

前言

推荐博客: https://blog.csdn.net/qq_39326472/article/details/88089747

传输层和网络层的关系

  • 网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。
  • 传输层提供了进程中的逻辑通信,传输层向高层用户屏蔽了网络层的核心实现,使得应用进程看起来像是两个传输层实体之间一条端到端的逻辑通信信道。

实际上,传输层和应用程序进程之间通过Socket(套接字)关联,这样通过Socket就可以区别同一主机上的不同应用进程,从而传输层提供服务变为可能;

实际上,每个套接字都有一个唯一的ID,被称为端口号;而在传输层接收到来自应用程序的分组并通过添加传输层首部而形成报文段的过程中,该端口号被写入;端口号大小在0-65535之间,其中0-1023属于周知端口号,它们为特定的Socket而拥有。

阅读更多...

排序-03-快速排序

排序-03-快速排序

1. 思想

  • 快速排序,说白了就是给基准数据找其正确索引位置的过程.

举个栗子:

  • 如下图所示,假设最开始的基准数据为数组第一个元素23,则首先用一个临时变量去存储基准数据,即tmp=23;然后分别从数组的两端扫描数组,设两个指示标志:low指向起始位置,high指向末尾.

mark

阅读更多...

git-01-基本使用

git-01-基本使用

前言

  • Git是目前世界上最先进的分布式版本控制系统,在处理各种项目时都十分高效,而且非常的高大上。
  • SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。而且集中式版本控制系统是必须联网才能工作。
  • Git是分布式版本控制系统,它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。

参考博客https://www.runoob.com/git/git-basic-operations.html

阅读更多...

JUC-16-Future

JUC-16-Future

1. Future 接口

  • Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果等操作。

  • 必要时通过get 方法获取执行结果,该方法会阻塞直到任务返回结果。

  • 当一个线程需要等待另外一个线程把某个任务执行完成后它才能继续执行,此时可以似乎用FutureTask

  • Future类位于java.util.concurrent包下,它是一个接口:

阅读更多...

Spring-11-设计模式

Spring-11-设计模式

前言

  • 由于我的个人能力有限,文中如有任何错误各位都可以指出。另外,文章篇幅有限,对于设计模式以及一些源码的解读我只是一笔带过,这篇文章的主要目的是回顾一下 Spring 中的设计模式。

  • Design Patterns(设计模式) 表示面向对象软件开发中最好的计算机编程实践。 Spring 框架中广泛使用了不同类型的设计模式,下面我们来看看到底有哪些设计模式?

阅读更多...
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信