Wednesday, July 21, 2021

V2EX - 技术

V2EX - 技术


Java 新手 求解 死锁要怎么处理

Posted: 21 Jul 2021 04:17 AM PDT

题目是 10 个线程 对应 20 个账号 每个线程执行 100 次 任意 2 个账号之间的金额交易

代码实现中遇到了死锁

假设线程 A 对 账户 A 账户 B 执行交易 ( A 转钱到 B ) 线程 B 对账户 B 和账户 A 执行交易( B 转钱到 A )

我代码写的是先锁一个账号 判断账号余额是否足够,然后锁另一个账户 最后执行转账

但是同时有 2 个线程执行了 2 个相同账户的反向操作时,就会死锁了。

package cn.bobmao.logic.service;  import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger;  public class Test {     class Account {         int index;         int balance = 100;          public Account(int index) {             this.index = index;         }     }      public static void main(String[] args) throws InterruptedException {         new Test().run();     }      public void run() throws InterruptedException {         AtomicInteger sum = new AtomicInteger(0);         List<Account> accounts = new ArrayList<>();         for (int i = 0; i < 20; i++) {             accounts.add(new Account(i));         }         ExecutorService executorService = Executors.newFixedThreadPool(10);          CountDownLatch latch = new CountDownLatch(1000);         for (int i = 0; i < 10; i++) {             executorService.submit(new Pay(accounts, latch, sum));         }          latch.await();           int count = 0;         for (Account account : accounts) {             count += account.balance;         }          System.out.println(count);       }      class Pay implements Runnable {         List<Account> accounts;         CountDownLatch latch;         AtomicInteger sum;          public Pay(List<Account> accounts, CountDownLatch latch, AtomicInteger sum) {             this.accounts = accounts;             this.latch = latch;             this.sum = sum;         }          @Override         public void run() {             for (int i = 0; i < 100; i++) {                 int money = new Random().nextInt(100);                 // a->b                 int a = new Random().nextInt(20);                 int b = new Random().nextInt(20);                 latch.countDown();                 if (a == b) {                     System.out.println("当前执行次数" + sum.getAndIncrement());                      continue;                 }                 Account ac = accounts.get(a);                 synchronized (ac) {                     System.out.println("锁 ac " + ac.index + " " + Thread.currentThread().getName());                     if (ac.balance >= money) {                         Account bc = accounts.get(b);                         synchronized (bc) {                             System.out.println("锁 bc " + ac.index + " " + Thread.currentThread().getName());                             ac.balance = ac.balance - money;                             bc.balance = bc.balance + money;                             //latch.countDown();                         }                         System.out.println("解锁 bc " + ac.index + " " + Thread.currentThread().getName());                     }                 }                 System.out.println("解锁 ac " + ac.index + " " + Thread.currentThread().getName());                 System.out.println("当前执行次数" + sum.getAndIncrement());             }         }     } }   

为什么开发人员都不愿意写接口文档?

Posted: 21 Jul 2021 04:15 AM PDT

白群晖客户端数据同步不正常的问题

Posted: 21 Jul 2021 04:05 AM PDT

群晖是一台 1621,手头有几台电脑,都是 Win10,上传都没问题,但是无论是否设置成按需同步,都有遇到数据同步不下来的问题,具体现象是提示同步完成,但是个别文件夹里还是空的,啥也没有,停止再恢复同步也不能解决,删掉同步任务,换一个新文件重新设置一个新的同步任务,还存在这个问题,切换是否按需同步,偶尔能同步出一些未同步的文件,但是依旧不全,而且有效果的几率很低。群晖上文件不多,一万出头,哪些文件无法正常同步暂时没发现什么规律,找了群晖客服也没能解决。

不知道有人遇到过这个问题没,已经建议群晖官方增加一个数据校验的功能,但是估计不一定采纳,即使采纳,更新也是猴年马月了。。

你们刷算法题会直接看题解吗?

Posted: 21 Jul 2021 03:56 AM PDT

发现我刷算法题存在一个问题,就是自己的解法每次都是复杂度最高的,这样我还不如直接看题解,记住题解里的解法。

感觉 aiomysql,异步执行多个查询,性能并没有显著的提升啊

Posted: 21 Jul 2021 03:44 AM PDT

代码如下:

 async def query(self, query, param=None):         conn, cur = await self.getCursor()         try:             await cur.execute(query, param)             return await cur.fetchall()         except:             print('error')         finally:             if cur:                 await cur.close()             await self.pool.release(conn)  # mysqlobj 是 aiomysql 连接池对象  result = await asyncio.gather(mysqlobj.query(sql1), mysqlobj.query(sql2), mysqlobj.query(sql3), mysqlobj.query(sql4), mysqlobj.query(sql5))  

在我的理解中,如果异步执行的话,这段代码执行的时长应该是这 5 个 sql 中耗时最长的时长,但是测试多次,相对同步执行这 5 个 sql 来说,执行时间并没有显著的提升。各位大佬能指点一下吗?

cmd 无法显示带颜色字体

Posted: 21 Jul 2021 03:29 AM PDT

WdAdl8.png

一个 Rust 编写的程序,Cargo 运行正常,单独启动就乱码,不知道为什么

PowerShell 正常

发现一个从官网下载 windows iso 的方法,包括老版本。

Posted: 21 Jul 2021 03:15 AM PDT

家人们,我需要在老家安装一个摄像头,我如何把摄像头的视频上传到我新家的 nas 中

Posted: 21 Jul 2021 03:03 AM PDT

最近做了个公司的微信公众号网页的项目,真是写吐了

Posted: 21 Jul 2021 03:01 AM PDT

官方的开发模拟器有大量行为跟真机不一致,尤其是 iPhone 上底部居然有前进和返回键,而开发模拟器上完全没体现,而且这个返回键好像还是 html 实现的,导致上实机一看 y 轴排版滚动条啥的整个垮掉

还有个按右上角…弹出的操作栏里有个刷新,然后点击刷新就会清掉 path 跑回主页,然而模拟器里的刷新就是正常的刷新

用的库也是好几年没人维护的 ant design mobile,国内现在几大山头都搞自己的移动端体系,结果到头来连个好用的 ui 库都没有,搞来搞去不知道在搞个啥

关于微信公众号网页,大家有没有比较舒适的开发方案推荐啊

关于超薄手机

Posted: 21 Jul 2021 02:51 AM PDT

家里翻出了一部 oppo r9s,这个手机是真的薄,查了参数厚度只有 6.6mm
现在还有类似于这么薄的手机吗

求问测试大佬, HTTP 接口的自动化测试如何解决数据污染问题

Posted: 21 Jul 2021 02:50 AM PDT

一个简单的 Web 服务, 数据都在数据库中.

但所有人都在往数据库中修改数据.

那么, 这种情况下, 如何做 HTTP 接口的自动化测试呢?

爱思助手有了 Linux 版本

Posted: 21 Jul 2021 02:37 AM PDT

求推荐个终端工具可以友好的显示 SQL 查询结果的

Posted: 21 Jul 2021 02:34 AM PDT

就两个要求:
1. 记得住 SSH 配置
2. SQL 查询结果列名和列值可以一一对应显示且可以设置不自动换行

在用的几款 SQL 结果都是一坨,完全没法看,求求谁来拯救我

安卓开发小技巧,教你们如何用文本 XML 动态生成界面。

Posted: 21 Jul 2021 02:07 AM PDT

第一步,运行时动态下载 Layout XML 文件,用 binxml 之类的工具函数,转换成 Byte[]类型的二进制 XML (模仿 AndroidStudio 的资源编译流程)

第二步,把每个按钮的资源 ID 包名赋值一下,因为动态载入 Layout 的 JAVA 函数,会自动去 resources.arsc 资源列表查找对应的 ID,而按钮是动态生成的,根本就没有 ID,需要随便分配一个,只要当前 View 内不重复即可。

第三步,用 LayoutInflater.inflate 和老外写的 XmlBlock 内部资源解析函数,正式加载二进制 XML 界面,转换成 View 组件。( https://github.com/liudongmiao/preference-fragment-compat/blob/master/src/me/piebridge/android/preference/PreferenceFragment.java#L235 )

第四步,用 findViewById 查找按钮的 view, 用 setOnClickListener 设置响应事件,setContentView 显示出来,搞定收工。

手机 wifi 断连问题

Posted: 21 Jul 2021 01:52 AM PDT

买了个 Sony Xperia1 iii
使用的过程中发现 wifi 时不时会断
不是断流( wifi 连着但是上不去网),是直接 wifi 显示断开变成了 5G
手机的 wifi 设置里所有选项都试过了都不起作用
重置网络也试过了 没用
手机选项里如果开启自动连接 会重连 但是会有个几秒的网络切换时间


不知道是不是跟路由器有关系,但是家里的其他设备都没有这个问题
我用的 OpenWRT 的软路由加上 Linksys 的 MX5300 AP 模式
每次断线重连之后在路由器上可以看到 DHCP 的续期都更新了
有个细节是这个手机是家里第一台 wifi6 设备
手机断连重连之后有的时候显示是 wifi6 有的时候显示是 wifi5

有没有机友碰到过类似问题?给个尝试的思路
谢谢

我这种需求是不是一台 DS118 就够了?

Posted: 21 Jul 2021 01:42 AM PDT

1 、svn 2 、webdav 、smb 、FTP 之类可以实现远程听无损 3 、低功耗、低噪音、够便宜

C++大佬请看, boost::base_collection<T> 会对 T 做一个 std::is_trivial 的判断, 这个有办法做前置类型声明吗?

Posted: 21 Jul 2021 01:20 AM PDT

现在两个类需要相互引用, 直接 class B; 前置引用, is_trivial 编译失败

// file A.hpp #include "B.hpp" class A { public:     bool a = std::is_trivial_v<B>; }; 
// file B.hpp #include "A.hpp" class B { public:     bool a = std::is_trivial_v<A>; }; 

centos7 单线多 vlan 汇聚多条宽带做负载均衡

Posted: 21 Jul 2021 01:17 AM PDT

如题,有 3 条宽带,经过 vlan 交换机,进 centos7 里面,想用 pppoe 拨号。3 条宽带分别对应交换机 vlan101 vlan102 vlan103.做了 access,接 centos7 的口做了 trunk 思路: 微信图片_20210721141828.jpg 看图 实际操作,按照 google 百度结果,配置了 vconfig,配置了对应的接口,开启了 8021q 依然不能用.... PS:交换机肯定是对的,因为我用 win10 设置网卡 vlanid 101 拨号是没任何问题得。

问一个关于切片和数组的问题。

Posted: 21 Jul 2021 12:56 AM PDT

package main  import "fmt"  func main() { 	x1 := [...]int{1, 3, 5} // 数组 	s1 := x1[:]             // 切片 	// s1=[1 3 5],len(s1)=3,cap(s1)=3,0xc0000b6000 	fmt.Printf("s1=%v,len(s1)=%v,cap(s1)=%v,%p\n", s1, len(s1), cap(s1), s1) 	/* 		1 、切片不保存具体的值 		2 、切片对应一个底层数组 		3 、底层数组都是占用一块连续的内存 	*/ 	s1 = append(s1[:1], s1[2:]...) // 相当于改的是底层数组!!! 	// s1=[1 5],len(s1)=2,cap(s1)=3,0xc0000b6000 	fmt.Printf("s1=%v,len(s1)=%v,cap(s1)=%v,%p\n", s1, len(s1), cap(s1), s1) 	fmt.Println(x1) // [1 5 5] } 

因为 Go 没有删除切片元素的专用方法,那么切片append的时候,实际是删除了索引为 1 的元素 3,所以切片打印为[1 5]

但是为什么数组最后是[1 5 5]呢?

个人猜测:
因为数组初始化后长度是固定的,不可变更。
所以,切片把数组的索引为 1 的元素 3删除了,进而把元素 5放在了元素 3的索引处,导致数组的值变成了[1 5 5],而数组索引为 2 的元素 5的值及内存地址是没变化的(我比较了 &s1[2] 和 &x1[2] 发现是一样的)。

希望各位 Go 前辈解惑。万分感谢您的回复。

c++中, char* 如何转换成 std::shared_ptr<std::iostream>?

Posted: 21 Jul 2021 12:24 AM PDT

用 aliyun 的 oss sdk 上传 buff 内容,aliyun 用的是智能指针。

实习生,公司项目 Java Kotlin 混用, Java 套路都没摸清,就要学 Kotlin,很难受

Posted: 20 Jul 2021 10:46 PM PDT

事情是这样子的

目前大三在在公司实习,服务端研发,部门的项目目前接触到的都是 Java 和 Kotlin 混用,而且使用 Kotlin 居多

今天老大丢给我一个线上的小缺陷,要我查出来修复,Kotlin 的代码看的那叫一个酸爽

数据的处理流程很长,经常是一个方法里面异步调用完一个微服务拿到流,直接 return 一个几十行的 lambda 表达式,主要处理逻辑放在 return 的 lambda 表达式里面。不知道说没说清楚,反正看了一天都给我整懵了,感觉和之前自己写的 Java 方法有很大出入(一般都是在方法体里面完成处理逻辑嘛,然后 return 返回处理后结果)

目前想请教一下各位大虾有没有快速入门 kt 的建议

然后还有个疑惑,作为 Java 小白,未来是想往 Java 方向发展的,目前也在准备秋招,实习的话因为公司需要还是会学习 Kotlin 的一些基础用法,但是如果重心放在 Kotlin 会不会不太明智

Google Maps Timeline 无法开启怎么回事?

Posted: 20 Jul 2021 10:42 PM PDT

按照要求,把权限都给了,然后在 location history 就是没法勾上当前的设备(iphone 11).
显示 "Location History is not available for this device"
最初以为是 iphone 的关系,让朋友试了试,结果可以。
后来切换了一个 google 账号,发现也可以。
唯独自己的主号,无法勾选本设备。
截图: https://imgur.com/KjcT7ge

现在的 DBA 都去哪里交流?多年前的 itpub 好像不行了

Posted: 20 Jul 2021 10:42 PM PDT

还是现在都不用论坛交流了?。。。

有一个疑问,在 JS 中 Array.forEach()与 Array.map()这些方法的第三个可选参数 array 的作用

Posted: 20 Jul 2021 10:23 PM PDT

Rt. 一直有一个疑问,就是forEachmapfilter之类的操作数组的方法,都有一个 array 的可选参数,返回的是当前操作的数组。

但每次使用都需要 arrayData.forEach(... 来执行,所以为什么不直接在回调函数内使用一开始的 arrayData 来用呢?和第三个可选参数 array 的区别是什么?

参数

callback 为数组中每个元素执行的函数,该函数接收一至三个参数:

  • currentValue 数组中正在处理的当前元素。
  • index [可选] 数组中正在处理的当前元素的索引。
  • array [可选] forEach() 方法正在操作的数组。

thisArg 可选 可选参数。当执行回调函数 callback 时,用作 this 的值。

forEach - MDN

创建谷歌账户需要 IP 很干净?

Posted: 20 Jul 2021 09:24 PM PDT

今天注册谷歌账户,使用了 https://sms-activate.ru/ 这个接码平台的号码,但是
他里面的很多国家的号码都试了,没有注册成功谷歌账户。那个商家说是我的问题,我用 whoer.net 测试了一下,分值是百分之九十。

看不懂自定义 magic 文件的规则,求指点.

Posted: 20 Jul 2021 09:16 PM PDT

对 file 命令识别文件类型感兴趣,查了下资料, 发现是有系统内置了 magic 文件,相当于数据库,定义了一些通过文件头的内容来识别文件类型的规则, 不过苦于里面的一些规则看不懂, 还望指点. 就是图片上的 *0x18, >*0x3c , >+54

0   short	0x5AD4	DOS executable *0x18	Short	0x40 >*0x3c	Short	0x6584C OS/2 linear executable >*0x3C	Short	0x454e >+54byte	1	OS/2 format >+54byte	2	Windows format 0   short	0xFDF0	DOS library 0   string	AH	Halo bitmapped font file 0   short	0x601A	Atara ST contiguous executable 

微服务拥抱云原生?微服务和单独架构,服务到底多少规模才合适上微服务? 10 个 100 个 1000 个?

Posted: 20 Jul 2021 08:49 PM PDT

VLOOK 10.7 发布!「表格/插图/代码块」竟然也能开启「画中画」~好用实用的 Markdown 主题包和增强插件

Posted: 20 Jul 2021 05:04 PM PDT

VLOOK™ 是针对 Typora (跨平台 Markdown 编辑器)的 主题包增强插件(针对导出的 HTML 文件)。

VLOOK™ 属于开源软件(遵从 MIT License),也是 ![OSChina]开源中国 推荐的国产开源产品、Typora 的首个增强插件。

VLOOK™ 的所有特性清单,详见快速入坑 → 一键进入 ( Gitee / GitHub )

V10.7 版本为各位 Markdown 粉带以下新的惊喜!!!

★ NEW! 插图 /表格 /代码块 自动开启「画中画」特性

  • 在文档右下角浮动显示,支持缩放和原比例显示

VLOOK™ 的「画中画」

★ NEW! 全新的内容助手

  • 鼠标在插图、表格、代码块悬停激活,集成内容相关操作,更便捷

★ NEW! 支持「无封面」模式

  • 适用于简单文档发布,或集成到网站内等场景

★ NEW! 支持文档字数及阅读时长统计

  • 鼠标悬停后扩展显示 CJK 字数、非 CJK 字数

— What's IMPROVED —

  • 章节导航 增加文档标题,支持点击回到封面
  • 导航中心 分类索引搜索增加对表格、代码块、SVG 内文本的匹配
  • 完善「文艺范」字体主题配置,交互动画体验细节
  • 完善演示辅助工具分组样式
  • 完善页内跳转的微调处理

— What's CHANGED —

  • 表格 十字光标的开 /关操作调整到内容助手中
  • 插图 点击 D 插图浏览器中打开的操作调整到内容助手上

— What's FIXED —

  • 逐章导航 向前一章为封面时跳转失败
  • 彩虹引用 引用内 H6 指定为 theme1 的样式错误

欢迎 Markdown 粉加入 VLOOK™ 的 Q 群


项目托管于:

大家用 Macbook 的时候用什么 IDE 编辑器环境?求推荐

Posted: 20 Jul 2021 02:26 PM PDT

目前我用的 Macbook 在终端里用 vim,听说 vscode 很好,但是一直没怎么习惯,求快速入门 vscode 方法。

===== 顺便建了群帮西安老乡介绍西安 IT 公司环境以及工作机会: http://u6v.cn/5xa3s7

群晖 Drive X 发布了

Posted: 20 Jul 2021 02:19 PM PDT

看了一下是 5 月份的版本,现在才发布。目前是测试阶段,感兴趣的玩。 地址: https:/删 /event.synology.cn/zh-cn/Synology_Drive_X

ssh -T git@github.com 出现 nc: Proxy error: "HTTP/1.1 200 Connection established" 的错误

Posted: 20 Jul 2021 06:58 AM PDT

系统环境

  • ZSH: 5.7.1 (x86_64-apple-darwin19.0)
  • ProductName: Mac OS X
  • ProductVersion: 10.15.7
  • BuildVersion: 19H524
  • ClashX Version: 1.65.0.2

SSH config 内容:

Host github.com gist.github.com gitlab.rightcapital.io     Hostname %h     User git     IdentityFile ~/.ssh/ssh_rsa     Compression yes     ForwardAgent yes     UseKeychain yes     AddKeysToAgent yes     ServerAliveInterval 30 

代理配置

  • 系统代理,未开启 Enhanced mode
  • mixed-port: 7890

控制变量

  • oh-my-zsh 的 Shell Proxy plugin 开启前后
    • 该插件读取的 $DEFAULT_PROXY 被设置为 export DEFAULT_PROXY="http://127.0.0.1:7890"

结果对比

关闭 shell-proxy 时,ssh -T git@github.com 执行结果:

❯ ssh -T git@github.com Hi user! You've successfully authenticated, but GitHub does not provide shell access. 

dig github.com 执行结果:

❯ dig github.com  ; <<>> DiG 9.10.6 <<>> github.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27922 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1280 ;; QUESTION SECTION: ;github.com.			IN	A  ;; ANSWER SECTION: github.com.		11	IN	A	52.74.223.119  ;; Query time: 8 msec ;; SERVER: 192.168.50.1#53(192.168.50.1) ;; WHEN: Tue Jul 20 20:14:34 CST 2021 ;; MSG SIZE  rcvd: 55 

开启 shell-proxy 后,ssh -T git@github.com -vvv 执行结果:

❯ ssh -T git@github.com -vvv OpenSSH_8.1p1, LibreSSL 2.7.3 debug1: Reading configuration data /Users/user/.ssh/config debug1: /Users/user/.ssh/config line 1: Applying options for github.com debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 47: Applying options for * debug1: Executing proxy command: exec /Users/user/.oh-my-zsh/plugins/shell-proxy/ssh-proxy.py github.com 22 debug1: identity file /Users/user/.ssh/ssh_rsa type 0 debug1: identity file /Users/user/.ssh/ssh_rsa-cert type -1 debug1: Local version string SSH-2.0-OpenSSH_8.1 nc: Proxy error: "HTTP/1.1 200 Connection established" kex_exchange_identification: Connection closed by remote host 

dig github.com 执行结果:

❯ dig github.com  ; <<>> DiG 9.10.6 <<>> github.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18005 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1280 ;; QUESTION SECTION: ;github.com.			IN	A  ;; ANSWER SECTION: github.com.		10	IN	A	13.250.177.223  ;; Query time: 2 msec ;; SERVER: 192.168.50.1#53(192.168.50.1) ;; WHEN: Tue Jul 20 20:17:13 CST 2021 ;; MSG SIZE  rcvd: 55 

android studio 添加 gradle 配置 jackOpions{enable true}后,字符串被混淆

Posted: 20 Jul 2021 05:57 AM PDT

android studio 添加 gradle 配置 jackOpions{enable true}后,用于反射的字符串被混淆,如下:

Class.forName("com.android.test"); 被混淆成 Class.forName("a.a");

去掉 jackOpions{enable true}就没有问题,就不会被混淆;

都是在 release 下,Build apk 。

什么原因呀?

No comments:

Post a Comment