AQS原理以及AQS同步组件总结

AQS介绍

AQS全称(AbstractQueuedSynchronizer),即抽象队列同步器。该类位于java.util.concurrent.locks包下。

AQS是一个抽象类,主要用来构建锁和同步器。AQS 为构建锁和同步器提供了一些通用功能的是实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如 ReentrantLockSemaphore,其他的诸如 ReentrantReadWriteLockSynchronousQueueFutureTask(jdk1.7) 等等都是基于 AQS 的。

阅读更多

从ReentrantLock的角度分析AQS的原理以及应用

从ReentrantLock的角度分析AQS的原理以及应用

本文转载自美团技术团队从ReentrantLock的实现看AQS的原理及应用

前言

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。

下面列出本篇文章的大纲和思路,以便于大家更好地理解:

阅读更多

Java线程池介绍

线程池

为什么要使用线程池?

池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源维护在一个特定的 “池子” 中,规定其最小连接数、最大连接数、阻塞队列等配置,方便进行统一管理和复用,通常还会附带一些探活机制、强制回收、监控一类的配套功能。

普通情况下,我们需要使用线程的时候就直接去创建一个线程,这样子操作的方式十分简单,但是在高并发的情况下就会产生问题:

并发的线程数量过多,而每个线程完成其任务后便会被销毁,往往其执行的时间很短,这样频繁地创建线程就会大大降低系统的效率,因为频繁创建和销毁线程时间的开销很大。

阅读更多

EdgeX联邦推理结果展示

联邦推理

  1. 部署EdgeX环境

    kubectl apply -f test.yaml

  2. 启动云端推理服务

    python detect.py

  3. 使用postman 发送图片至EdgeX

    http://39.104.160.208:30086/api/v2/resource/sample-image/jpeg

  4. 使用k3s 查看容器日志

    kubectl logs -f edgex-app-service-simple-image-classification-http-75c66b5vh4f5

  5. 查看推理结果图片(图片保存在挂载目录下)

device-sdk-go源码分析

device-sdk-go源码分析

device-sdk-go项目目录结构

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
33
34
35
36
37
38
├─.github
│ └─ISSUE_TEMPLATE
├─bin
├─example
│ ├─cmd
│ │ └─device-simple
│ │ └─res
│ │ ├─devices
│ │ └─profiles
│ ├─config
│ └─driver
├─internal
│ ├─application
│ ├─autodiscovery
│ ├─autoevent
│ ├─cache
│ ├─clients
│ ├─common
│ ├─config
│ ├─container
│ ├─controller
│ │ └─http
│ │ └─correlation
│ ├─messaging
│ ├─provision
│ ├─telemetry
│ └─transformer
├─openapi
│ └─v2
├─pkg
│ ├─models
│ │ └─mocks
│ ├─service
│ └─startup
└─snap
├─hooks
└─local

阅读更多

本地docker镜像仓库部署

1.运行本地注册表

使用如下命令启动注册表容器:

1
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2

警告:仅适用于测试的注册表配置。生产就绪的注册表必须受 TLS 保护,并且最好使用访问控制机制。继续阅读并继续阅读配置指南以部署生产就绪注册表。

阅读更多

回调函数

GC垃圾回收

基本的实现思路是,从每个包级的变量和每个当前运行函数的每一个局部变量开始,通过指针或引用的访问路径遍历,是否可以找到该变量。如果不存在这样的访问路径,那么说明该变量是不可达的,也就是说它是否存在并不会影响程序后续的计算结果。

阅读更多

回调函数

什么是回调函数?

在维基百科中,给出了这么一个定义:在计算机程序设计中,回调函数,或简称回调(Callback 即call then back 被主函数调用运算后会返回主函数),是指通过参数将函数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

从图中可以这么理解,主程序在调用软件库的时候同时传入了一个回调函数,用来告诉这个库函数在执行完成后需要回调的函数,也就是主函数在调用库函数的同时也指定了回调函数,这样整个程序的灵活性会大大增强,通过传入不同的回调函数,就可以实现各种不同的功能。

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×