本讲我们研究另一篇著名的paper: compute-and-forward.

Coarse and Fine Lattices 的生成

首先,我们知道一个 nnn 维 lattice Λ\LambdaΛ 可以由一个生成矩阵 Bn×n\bm{B}_{n\times n}Bn×n​ 来表示:
Λ={s=Bc:c∈Zn}\Lambda = \{\bm{s=Bc:c\in\mathbb{Z}^n}\}Λ={s=Bc:c∈Zn}

其中 B\bm{B}B 是满秩的,因此所有可能的整数向量 c\bm{c}c 把 B\bm{B}B 的每一列延展到整个空间。但是 in general lattice并不需要充满整个空间. 它可以只充满 Rn\mathbb{R}^nRn 的一个subspace Rm\mathbb{R}^mRm, 此时我们可以假设 Bn×m\bm{B}_{n\times m}Bn×m​ 是一个列满秩矩阵.

好,了解了这一点我们现在可以开始着手构造 the nested lattice code used in this paper。首先,本文假设有多个 transmitter with the same power constraint PPP, 因此,我们选用同样的coarse lattice Λ\LambdaΛ。

Coarse lattice Λ\LambdaΛ – 生成矩阵为 Bn×n\bm{B}_{n\times n}Bn×n​, 且
σ2(Λ)=P\sigma^2(\Lambda)=Pσ2(Λ)=P

Fine lattice – 每个 user 都有不同的 rate 要求,因此我们让他们使用不同的fine lattice。Fine lattice的构造如下。

我们假设有 LLL 个用户. 每个用户想传输的信息都是从finite field Fp\mathbb{F}_pFp​ 上独立均匀采样的 (ppp is prime), 记为 wℓ\bm{w}_\ellwℓ​, 其长度分别为 kℓ:ℓ=1,2,...,Lk_\ell:\ell=1,2,...,Lkℓ​:ℓ=1,2,...,L 且 k1≤k2≤...≤kLk_1\leq k_2\leq ...\leq k_Lk1​≤k2​≤...≤kL​.

先看第 LLL 个用户

  1. 构造 Fp\mathbb{F}_pFp​ 上的随机矩阵 GL∈Fpn×kL\bm{G_L}\in \mathbb{F}^{n\times k_L}_pGL​∈Fpn×kL​​, 当 n→∞n\to\inftyn→∞ 时,此矩阵以概率1满秩。因此,它的 column space 张成了 Fpn\mathbb{F}^{n}_pFpn​ 的subspace FpkL\mathbb{F}^{k_L}_pFpkL​​.

  2. 构造 codeword. 对于每一个可能的信息 wL\bm{w_L}wL​,我们构造codebook如下
    CL={c=GLwL:∀wL∈Fpkℓ×1}\mathcal{C}_L=\{\bm{c}=\bm{G_L}\bm{w_L}:\forall~\bm{w_L}\in\mathbb{F}^{k_\ell\times 1}_p \}CL​={c=GL​wL​:∀ wL​∈Fpkℓ​×1​}
    也就是说,第 LLL 个用户可能传输的码字占满了Fpn\mathbb{F}^{n}_pFpn​ 的subspace FpkL\mathbb{F}^{k_L}_pFpkL​​ (注意他们都是 finite field)。

  3. 现在我们把 Fpn\mathbb{F}^{n}_pFpn​ 中的码字变换到实数域 Rn\mathbb{R}^nRn。总共两步操作,一是把finite field 归一化到 [0,1)n[0,1)^n[0,1)n 然后再周期拓展到整个 Rn\mathbb{R}^nRn 空间。这样得到的是一个 lattice
    Λ~L=1pg(CL)+Zn\tilde{\Lambda}_L = \frac{1}{p}g(\mathcal{C}_L)+\mathbb{Z}^nΛ~L​=p1​g(CL​)+Zn

  4. Λ~L\tilde{\Lambda}_LΛ~L​ 是一个沿着所有坐标轴分布的 lattice,下面我们把它按照coarse lattice 的方向旋转,这样便得到了第 LLL 个用户的 fine lattice
    ΛL=BΛ~L\Lambda_L=\bm{B}\tilde{\Lambda}_LΛL​=BΛ~L​

紧接着,对于其他用户 ℓ=L−1,L−2,...,1\ell=L-1,L-2,...,1ℓ=L−1,L−2,...,1, 我们可以重复以上四步得到fine lattice,不同的地方在于我们仅仅使用第 LLL 个用户的生成矩阵 GL\bm{G}_LGL​ 的前 kℓk_\ellkℓ​ 列来生成码字。这样的好处是,最后我们得到的 lattice 都是nested 的, 即
Λ⊆Λ1⊆Λ2⊆...⊆ΛL\Lambda\subseteq\Lambda_1 \subseteq\Lambda_2\subseteq...\subseteq\Lambda_LΛ⊆Λ1​⊆Λ2​⊆...⊆ΛL​

原因是,我们只使用了 GL\bm{G}_LGL​ 的前 kℓk_\ellkℓ​ 列,因此这样生成的 nnn 维码字 Cℓ\mathcal{C}_{\ell}Cℓ​一 定是在 CL\mathcal{C}_LCL​ 的subspace里。


Wrong interpretation, but why they are wrong?

我们可以举例来看,取

Fp={0,1,2,...,p−1}\mathbb{F}_p=\{0,1,2,...,p-1\}Fp​={0,1,2,...,p−1}

GL=[100010001⋮⋮⋮000]n×3\bm{G}_L=\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1\\ \vdots & \vdots & \vdots \\ 0 & 0 & 0 \\ \end{bmatrix}_{n\times 3}GL​=⎣⎢⎢⎢⎢⎢⎡​100⋮0​010⋮0​001⋮0​⎦⎥⎥⎥⎥⎥⎤​n×3​

这里 k=3k=3k=3, GL\bm{G}_LGL​ 的三列实际上就是 nnn 维空间中的三个方向, 所以我们随便取了三个方向。对于任意的message,这样生成的码字都只在前三个上非零即只在一个三维的subspace中。而如果有一个 kℓ=2k_\ell=2kℓ​=2, 那它只在前俩位置上非零。

所以 “信息短的用户的码字” 实际上是在 “信息长的用户的码字” 的subspace里的。最后生成的lattice也是如此,只不过他这种嵌套是 "nnn 维lattice中的 kℓk_\ellkℓ​ 维lattice" 这种嵌套关系。


系统模型和信号流


接下来我们研究一下本文的主要框架。在这个系统中总共有 LLL 个发送端,MMM 个中继, 一个 接收端。最终接收端是想把每个人的信息都 decode 出来。To this end, 每个中继的目的是decode出一个linear combination of the messages。

具体来说,

  1. 每个人要传输的信息是 wℓ\bm{w}_\ellwℓ​, 长度为 kℓk_\ellkℓ​, 均在finite field Fp\mathbb{F}_pFp​ 上取值。我们把用户排序使得 k1≤k2≤...≤kLk_1\leq k_2\leq ...\leq k_Lk1​≤k2​≤...≤kL​. 因为在中继端要计算信息的线性组合,所以我们把每个人的信息都加 0 到最大长度 kLk_LkL​.

  2. 函数 ϕ\phiϕ是一个mapping,把信息 wℓ\bm{w}_\ellwℓ​ 映射到 fine lattice Λℓ\Lambda_\ellΛℓ​ 上。注意这一步映射是一个 one-to-one mapping。

  3. 下一步加 dither 使得真正传输的lattice
    xℓ=(tℓ−dℓ)mod Λ\bm{x}_\ell=(\bm{t}_\ell-\bm{d}_\ell) ~\text{mod} ~\Lambdaxℓ​=(tℓ​−dℓ​) mod Λ
    在 coarse lattice Λ\LambdaΛ 中均匀分布且与 tℓ\bm{t}_\elltℓ​ 独立。(相当于就是一个均匀分布的lattice).

  4. 过信道。信道模型为
    [y1y2⋮yM]=[h11h12⋯h1Lh21h22⋯h2L⋮⋮⋱⋮hM1h12⋯hML][x1x2x3⋮xL]+[z1z2⋮zM]\begin{bmatrix} \bm{y}_1 \\ \bm{y}_2 \\ \vdots \\ \bm{y}_M \\ \end{bmatrix}=\begin{bmatrix} h_11 & h_12 & \cdots & h_1L \\ h_21 & h_22 & \cdots& h_2L \\ \vdots & \vdots & \ddots & \vdots \\ h_M1 & h_12 & \cdots & h_ML \\ \end{bmatrix}\begin{bmatrix} \bm{x}_1 \\ \bm{x}_2 \\ \bm{x}_3 \\ \vdots \\ \bm{x}_L \\ \end{bmatrix}+\begin{bmatrix} \bm{z}_1 \\ \bm{z}_2 \\ \vdots \\ \bm{z}_M \\ \end{bmatrix}⎣⎢⎢⎢⎡​y1​y2​⋮yM​​⎦⎥⎥⎥⎤​=⎣⎢⎢⎢⎡​h1​1h2​1⋮hM​1​h1​2h2​2⋮h1​2​⋯⋯⋱⋯​h1​Lh2​L⋮hM​L​⎦⎥⎥⎥⎤​⎣⎢⎢⎢⎢⎢⎡​x1​x2​x3​⋮xL​​⎦⎥⎥⎥⎥⎥⎤​+⎣⎢⎢⎢⎡​z1​z2​⋮zM​​⎦⎥⎥⎥⎤​
    可以把它想象成一个 MIMO 信道, LLL 发 MMM 收。

  5. 通过信道后,我们研究第 mmm 个 relay接收到的 nnn 长信号 ym\bm{y}_mym​. 两步处理,scale和去dither后我们得到
    sm=αmym+∑ℓ=1Lamℓdℓ\bm{s}_m=\alpha_m\bm{y}_m+\sum_{\ell=1}^{L}a_{m\ell}\bm{d}_\ellsm​=αm​ym​+ℓ=1∑L​amℓ​dℓ​
    注意,这里每个用户的信道都被一个constant αm\alpha_mαm​ scale 了,然后去 dither 加的是所有 LLL 个 dither 的线性组合。但是每个人使用的weights是不一样的 – 第 mmm 个人使用的weights 记作 {am}\{\bm{a_m}\}{am​}. 实际上relay 最终的目的也就是恢复所有发送code tℓ\bm{t}_\elltℓ​ 以 {am}\{\bm{a_m}\}{am​} 为系数的线性组合。
    vm=[∑ℓ=1Lamℓtℓ]mod Λ\bm{v}_m=\left[ \sum_{\ell=1}^{L}a_{m\ell}\bm{t}_\ell \right]~\text{mod}~\Lambdavm​=[ℓ=1∑L​amℓ​tℓ​] mod Λ
    换句话说,{am}\{\bm{a_m}\}{am​} 是我们的想要的信道形式,但是真实信道是 {hm}\{\bm{h_m}\}{hm​}。

  6. 由于信道和AWGN noise可以是任意实数,所以每个relay得到的 sm\bm{s}_msm​也可以是任意实数,因此我们需要把 sm\bm{s}_msm​ quantize 到最近的 lattice 上。问题是选用哪个lattice 尼?由于最终我们想恢复的 vm\bm{v}_mvm​ 是按照 am\bm{a_m}am​ 线性组合的 lattice,这里我们看 am\bm{a_m}am​ 中最大的非零元对应的用户 ℓmax⁡(m)\ell_{\max}(m)ℓmax​(m) – 即我们想恢复的信息 vm\bm{v}_mvm​ 中拥有最大rate的用户 – 并把 sm\bm{s}_msm​ quantize 到 Λℓmax⁡(m)\Lambda_{\ell_{\max}(m)}Λℓmax​(m)​ 上,giving
    v^m=Qm(sm)mod Λ\hat{\bm{v}}_m=\mathcal{Q}_m(\bm{s}_m)~\text{mod}~\Lambdav^m​=Qm​(sm​) mod Λ
    注意在 quantize 之后我们要保证 lattice 在 Voronoi region 中.

  7. 我们对第六步得到的信息进行一些变换
    v^m=Qm(sm)mod Λ=[Qm(smmod Λ)]mod Λ\hat{\bm{v}}_m=\mathcal{Q}_m(\bm{s}_m)~\text{mod}~\Lambda= \left[\mathcal{Q}_m(\bm{s}_m~\text{mod}~\Lambda)\right]~\text{mod}~\Lambdav^m​=Qm​(sm​) mod Λ=[Qm​(sm​ mod Λ)] mod Λ
    smmod Λ=[vm+∑ℓ=1Lθmld~ℓ+αmzm]mod Λ\bm{s}_m~\text{mod}~\Lambda=\left[\bm{v}_m+\sum_{\ell=1}^{L}\theta_{ml}\tilde{\bm{d}}_\ell+\alpha_m\bm{z}_m \right]~\text{mod}~\Lambdasm​ mod Λ=[vm​+ℓ=1∑L​θml​d~ℓ​+αm​zm​] mod Λ
    其中 θmℓ=αmhmℓ−amℓ\theta_{m\ell}=\alpha_mh_{m\ell}-a_{m\ell}θmℓ​=αm​hmℓ​−amℓ​; d~ℓ\tilde{\bm{d}}_\elld~ℓ​ 就是 xℓ\bm{x}_\ellxℓ​, 在Voronoi region 中的 lattice Λℓ\Lambda_\ellΛℓ​ 上均匀分布. 因此我们可以得出一个等价信道

等价模型和等价信道


v~m=[Qm(vm+zeq,m)]mod Λ\tilde{\bm{v}}_m=\left[\mathcal{Q}_m(\bm{v}_m+\bm{z}_{eq,m}) \right]~\text{mod}~\Lambdav~m​=[Qm​(vm​+zeq,m​)] mod Λ

zeq,m=∑ℓ=1Lθmld~ℓ+αmzm\bm{z}_{eq,m}=\sum_{\ell=1}^{L}\theta_{ml}\tilde{\bm{d}}_\ell+\alpha_m\bm{z}_mzeq,m​=ℓ=1∑L​θml​d~ℓ​+αm​zm​

比较真实模型和等价模型可以看出,信道由 {hm}\{\bm{h_m}\}{hm​} 变成了我们期望的 {am}\{\bm{a_m}\}{am​},噪声由 AWGN zm\bm{z}_mzm​ 变成了 zeq,m\bm{z}_{eq,m}zeq,m​ 其中一部分是channel mismatch θmℓ=αmhmℓ−amℓ\theta_{m\ell}=\alpha_mh_{m\ell}-a_{m\ell}θmℓ​=αm​hmℓ​−amℓ​ 还有一部分是 scaled AWGN αmzm\alpha_m\bm{z}_mαm​zm​.

真实模型得出的 v^m\hat{\bm{v}}_mv^m​ 和等价模型 v~m\tilde{\bm{v}}_mv~m​ 是等价的。而且error probability Pr⁡{v^m≠vm}\Pr\{\hat{\bm{v}}_m\neq\bm{v}_m\}Pr{v^m​​=vm​} 就是 quantization 出错的概率,也就是噪声跑出 Voronoi region V(Λℓmax⁡(m))\mathcal{V}(\Lambda_{\ell_{\max}(m)})V(Λℓmax​(m)​) 的概率。Λℓmax⁡(m)\Lambda_{\ell_{\max}(m)}Λℓmax​(m)​ 也是 relay 要 decode 的 message vm\bm{v}_mvm​ 中最 fine 的那个lattice的 Voronoi region.

需要注意的是,zeq,m\bm{z}_{eq,m}zeq,m​ 并不是Gaussian,甚至也不是空间对称的,因此没法直接研究它的特性。但是好在我们可以upper bound its density by the density of an i.i.d. Gaussian with the same variance, i.e.,
zm∗∼N(0,σm2)\bm{z}_m^*\sim\mathcal{N}(0,\sigma^2_m)zm∗​∼N(0,σm2​)

σm2=Neq,m=P∑ℓ=1Lθmℓ2+αm2=P∥αmhm−am∥2+αm2\sigma^2_m=N_{eq,m}=P\sum_{\ell=1}^{L}\theta^2_{m\ell}+\alpha_m^2=P\|\alpha_m\bm{h}_{m}-\bm{a}_{m}\|^2+\alpha_m^2σm2​=Neq,m​=Pℓ=1∑L​θmℓ2​+αm2​=P∥αm​hm​−am​∥2+αm2​

可以证明,利用最开始讲的构造方法构造出来的 lattices 是 good for AWGN的。即,在每个relay处,只要 the volume-to-noise ratio 满足
μ(Λℓmax⁡(m),ϵm)>2πe(1)\mu(\Lambda_{\ell_{\max}(m)},\epsilon_m)>2\pi e ~~~~(1)μ(Λℓmax​(m)​,ϵm​)>2πe    (1)

那么 error probability
ϵm=Pr⁡{zm∗∉Vℓmax⁡(m)}\epsilon_m=\Pr\{\bm{z}_m^*\notin\mathcal{V_{\ell_{\max}(m)}} \}ϵm​=Pr{zm∗​∈/​Vℓmax​(m)​}

就会随着 nnn 的增大呈指数的趋近于 000.


Remark – 注意,the volume-to-noise ratio 中 volume指的是 the finest lattice 的 Volume 而 noise 指的是 upper bound noise zm∗\bm{z}_m^*zm∗​ 的 power。μ(Λ,ϵ)\mu(\Lambda,\epsilon)μ(Λ,ϵ)的定义是
μ(Λ,ϵm)=(Vol(Λ))2/nσ2\mu(\Lambda,\epsilon_m)=\frac{(\text{Vol}(\Lambda))^{2/n}}{\sigma^2}μ(Λ,ϵm​)=σ2(Vol(Λ))2/n​

其中 σ2\sigma^2σ2 是满足 ϵ\epsilonϵ 的AWGN噪声功率。可以看到,the volume-to-noise ratio 的意义就是给定一个 lattice 给定一个期望的 error probability,后右边两者的比值。


因为真实噪声upper bounded by zm∗\bm{z}_m^*zm∗​, 因此只要满足 (1), Pr⁡{zeq,m∉Vℓmax⁡(m)}\Pr\{\bm{z}_{eq,m}\notin\mathcal{V_{\ell_{\max}(m)}} \}Pr{zeq,m​∈/​Vℓmax​(m)​} 也会随着 nnn 的增长呈指数的趋近于 000.

By the union bound, 平均错误概率
ϵ≤∑m=1MPr⁡{zeq,m∉Vℓmax⁡(m)}\epsilon\leq\sum_{m=1}^{M}\Pr\{\bm{z}_{eq,m}\notin\mathcal{V_{\ell_{\max}(m)}} \}ϵ≤m=1∑M​Pr{zeq,m​∈/​Vℓmax​(m)​}

因此我们要求右边的每一项都趋近于0,即所有 relay 的lattice都满足 (1) 式. 这也就意味着我们对每一个用户的 Voronoi region 都有要求,即
Vol(Vl)>(2πemax⁡m:amℓ≠0σm2)n/2(2)\text{Vol}(\mathcal{V}_l)>\left(2\pi e \max_{m:a_{m\ell}\neq 0} \sigma^2_m\right)^{n/2}~~~~(2)Vol(Vl​)>(2πem:amℓ​​=0max​σm2​)n/2    (2)

即,对于第 ℓ\ellℓ 个用户来说,他需要确保自己的 Voronoi region 在任意一个想decode它的接收端(准确说是包含他的信息)都要大于右式。

又,coarse lattice 的 volume 是由 power constraint 决定的,即
G(Λ)=σ2(Λ)Vol(V)2/n=PVol(V)2/nG(\Lambda)=\frac{\sigma^2(\Lambda)}{\text{Vol}(\mathcal{V})^{2/n}}=\frac{P}{\text{Vol}(\mathcal{V})^{2/n}}G(Λ)=Vol(V)2/nσ2(Λ)​=Vol(V)2/nP​

所以
Vol(V)=(PG(Λ))n/2(3)\text{Vol}(\mathcal{V})=\left(\frac{P}{G(\Lambda)}\right)^{n/2} ~~~~(3)Vol(V)=(G(Λ)P​)n/2    (3)

对于第 ℓ\ellℓ 个用户,它的 rate是
rℓ=1nlog⁡(Vol(V)Vol(Vℓ))r_\ell=\frac{1}{n}\log\left(\frac{\text{Vol}(\mathcal{V})}{\text{Vol}(\mathcal{V_\ell})}\right)rℓ​=n1​log(Vol(Vℓ​)Vol(V)​)

因此,只要用户按照 (2) 选择 Voronoi region 那么所有 relay 的 error probability 都能降为 0。这也就意味着以下rate是可达的
rℓ<min⁡m:amℓ≠012log⁡+(P2πeG(Λ)σm2)r_\ell<\min_{m:a_{m\ell}\neq 0} \frac{1}{2}\log^+\left( \frac{P}{2\pi eG(\Lambda)\sigma^2_m} \right)rℓ​<m:amℓ​​=0min​21​log+(2πeG(Λ)σm2​P​)

当 n→∞n\to\inftyn→∞, 一个好的 lattice 近似是一个球 2πeG(Λ)→12\pi eG(\Lambda)\to12πeG(Λ)→1, 因此上式可以写为
rℓ<min⁡m:amℓ≠012log⁡+(Pσm2)=min⁡m:amℓ≠012log⁡+(PP∥αmhm−am∥2+αm2)r_\ell<\min_{m:a_{m\ell}\neq 0} \frac{1}{2}\log^+\left( \frac{P}{\sigma^2_m} \right)= \min_{m:a_{m\ell}\neq 0} \frac{1}{2}\log^+\left( \frac{P}{P\|\alpha_m\bm{h}_{m}-\bm{a}_{m}\|^2+\alpha_m^2} \right)rℓ​<m:amℓ​​=0min​21​log+(σm2​P​)=m:amℓ​​=0min​21​log+(P∥αm​hm​−am​∥2+αm2​P​)

这便是本文最重要的结论。对于第 mmm 个接收端来说,他看到的是一组 LLL 个信道 hm\bm{h_m}hm​, 但他想decode的是一组整数信道 am\bm{a}_mam​. 那么 αmhm\alpha_m\bm{h}_{m}αm​hm​ 与 am\bm{a}_{m}am​ 差得越远,在这个接收端的 equivalent noise 也就越大。 对于第 ℓ\ellℓ 个用户来说,它在一个接收端能达到的rate受限于接收端的equivalent noise (与所有 LLL 个信道 hm\bm{h}_mhm​ 和这个接收端要decode的一组 am\bm{a}_mam​有关), 因此最终它的可达rate是在所有接收端achieve的rate中的最小值。

对于一个relay来说,给定一组信道 hm\bm{h}_mhm​ 和 am\bm{a}_mam​, 我们要选取一个好的scaling factor αm\alpha_mαm​ (实数) 来maximize 右边,求一阶导并置零可得
αm∗=Phm⊤am1+P∥hm∥2\alpha_m^*=\frac{P\bm{h}_m^\top\bm{a}_m}{1+P\|\bm{h}_m\|^2}αm∗​=1+P∥hm​∥2Phm⊤​am​​

实际上这个最好的 αm\alpha_mαm​ 也就是 MMSE coefficients.

Lattice原理及在通信中的应用 5 Applications -- Compute-and-Forward相关推荐

  1. Lattice原理及在通信中的应用 1 Lattice 基础

    本文 largely based on Prof. Kschischang 和 Chen Feng 2014 年给的 tutorial.原 tutorial 的标题是 "An Introdu ...

  2. Lattice原理及在通信中的应用 2 Packing, Covering, Quantization, Modulation

    在讲了大一堆概念之后,我们终于可以开始来看看 lattice 的一些性质了.其实lattice有很好的几何含义,因此实际上关于 lattice的概念和性质都还是很好理解的. 首先一个问题就是 pack ...

  3. OPC通信原理在数采中的应用

    OPC通信原理在数采中的应用 OPC是Object Linking and Embedding(OLE)for Process Control的缩写,它是微软公司的对象链接和嵌入技术在过程控制方面的应 ...

  4. 学习通信原理之——从实验中理解频谱/功率谱/功率谱密度(MATLAB演示)

    我的个人博客文章链接如下:学习通信原理之--从实验中理解频谱/功率谱/功率谱密度(MATLAB演示) 前言 最近在复习通信原理,每次到了功率谱这一块就感到困惑,每次都要去查,我觉得不能再这样循环下去了 ...

  5. 技术干货 | 为高音质保驾护航 - 通信中的回声消除

    导读:语音通信,在当代生活已经成为了大家主要的沟通交流方式,而通话语音的质量也是衡量每个厂商系统好坏的标志之一.这次给大家分享网易云信是如何通过回声消除算法保证通话语音质量的. 文|胡林艳 网易云信音 ...

  6. java await signal_【Java并发008】原理层面:ReentrantLock中 await()、signal()/signalAll()全解析...

    一.前言 上篇的文章中我们介绍了AQS源码中lock方法和unlock方法,这两个方法主要是用来解决并发中互斥的问题,这篇文章我们主要介绍AQS中用来解决线程同步问题的await方法.signal方法 ...

  7. fullcalendar 显示的时间间隔只有四十五分钟_NHR系列智能显示控制仪表RS485通信中应用...

    请点击上方蓝字关注我们! 01 摘要 NHR系列智能显示控制仪表是经过多年开发制造经验而设计生产,集诸多全新功能于一身的新一代智能显示控制仪表.针对现场温度.压力.液位.速度.流量等各种信号进行采集. ...

  8. android中多态的应用_动态代理原理及在 Android 中的应用

    code小生 一个专注大前端领域的技术平台公众号回复Android加入安卓技术群 作者:trampcr 链接:https://www.jianshu.com/p/492903ab2fae 声明:本文已 ...

  9. Arduino中Serial.print()与Serial.write()函数的区别,以及串口通信中十六进制与字符串的收发格式问题和转换过程详解

    1.串口通信中十六进制和字符数据的区别 串口收发数据时字符.十六进制.二进制格式详细区分 ASCII码查询表格 在使用串口发送数据时可以选择字符串(ASCII)发送或者十六进制(Hex)发送,通常情况 ...

最新文章

  1. Python实战案例,pyecharts模块,Python实现5G数据
  2. 23LC1024四线访问数据
  3. nginx.conf 基本配置模板和结构
  4. 单身狗有福了!斯坦福教授化身丘比特,AI算法之箭帮你配真命爱侣
  5. Java MVC框架性能比较
  6. 如何让你的手机比别人最先升级到 Android L
  7. 设计灵感|引导页设计中如何借助图形来展现场景?
  8. jquery图片预加载+自动等比例缩放插件
  9. 强烈推荐 16 款 IDEA 插件,让你的开发速度飞起来 | 原力计划
  10. VB数组快速排序算法
  11. python百度云安装包_phython爬全百度评价_python安装包百度云
  12. Android-JNI开发系列《十二》总结JNI知识体系
  13. 消息队列技术终结者(一)—通俗深刻地认识JMS(即Java Message Service)
  14. QCC3024/QCC3020/QCC3034 对讲机(Intercom) 蓝牙耳机 替代CSR8670
  15. 移动政企Java线上测评_(重要)如何锻炼训练,确保通过企业线上测评 在线测评和职业性格测评...
  16. 出租车计价器设计VHDL
  17. OL3+中链家地图找房功能实现
  18. json解析小冒号:出错
  19. Can't open /dev/sdb1 exclusively. Mounted filesystem?
  20. matlab全桥电路设计,全桥变换电路的Matlab仿真及实验装置开发.pdf

热门文章

  1. PB混淆加密大师(PB Obfuscator)产品路线PPT
  2. 多个linux服务器免密登录,使用公钥密钥直接连接
  3. 如何把Win10中的输入法切换方式改为经典的Win7输入法切换方式?
  4. js中isNaN的用法实践
  5. Python基础进阶(前言)
  6. 蓝桥杯之单片机设计与开发(20)——DS1302
  7. 魔鬼字典 JavaScript 笔记 看不懂可以哭~~~
  8. 基于phpmailer的企业邮箱发送邮件
  9. java 对象流判断文件末尾 ( end of file / eof异常处理 )
  10. 聚焦千千小说:一篇幽默风趣的网络小说爬虫教程