最近在看《Java编程思想》,记录一些觉得有必要整理的内容。本篇就简要分析一下Java并发编程中遇到的volatile关键字。

并发编程中,我们通常会遇到以下三个概念:原子性可视性以及有序性
volatile关键词正式对应可视性这个概念。

可视性是指,当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看到修改的值。即便使用了本地缓存,volatile修饰的域也会立即被写入到主存中,而读取操作就是发生在主存中。
而相应地,非volatile域上的原子操作不必刷新到主存中去,因此其他读取该域的任务也不必看到这个新值。

然而,要区分原子性和可视性是不同的概念。volatile关键字能保证可视性但并不能保证操作的原子性。如果一个域的值依赖于它之前的值,例如递增一个计数器,或者某个域的值收到其他域的值的限制,例如Range类的lower和upper边界就必须遵循lower<=upper的限制,那么只用volatie修饰是不起作用的。保持原子性或说同步,第一选择应该是使用synchronized关键字,同步也会导致向主存中刷新,因此synchronized防护的方法或语句块内的域就不必使用volatile修饰了。

阅读全文 »

背景

本篇博文分享下使用树莓派结合百度语音合成API进行当前时间和天气自动播报功能的实现。转载请注明出处。

阅读本文需要你有一定的Linux编码水平(主要是Bash)及一些python基础。
这个项目的想法初衷是希望树莓派能够定时地将一些信息通过蓝牙播放设备自动播放出来,初期先播放时间和天气,能够代替一个闹钟了呢,哈哈~~

方案设计

方案很简单,设置定时任务,将运行时时间获取到,并同时获取当前天气状况,然后使用百度语音合成API将获取到的信息转换成语音通过蓝牙连接的播放设备播放出来。

获取天气也使用了百度开放平台提供的接口,因此一共需要有百度开放平台和语音合成API两个接口的调用权限。

开放平台注册
语音合成API注册

获取天气

我们先来获取天气信息,API的返回结果结构如下:

我舍弃了穿衣指数什么的,只获取天气数据。

阅读全文 »

背景

阅读本文需要你有一定的Linux编码水平,至少能够读懂Bash,对于一个树莓派玩家来说这都不是事儿了吧。

树莓派使用Micro SD卡来作为系统存储,而SD卡又很容易坏,当我们辛苦配置好的树莓派工作环境因为SD卡挂掉,重装时各种配置又要来一趟真的很奔溃,关键还不记得当初一个个都配置了啥了。。

我最近在配置树莓派时就遇到了类似的问题,因为挂载移动硬盘出了点差错(下文会说),导致系统启动失败,以为是系统被我折腾坏了,格了好几遍SD卡重装,每次都要把软件、配置都重来一遍,于是索性将第一次开机后必做的几件事写成了初始化脚本传到github了,重装后直接下下来执行下就解决了。方便多了,再也不怕重装系统。

顺便记录下导致我写这个自动化初始化树莓派脚本的最初问题。

问题

一开始我的树莓派是没有显示器的,都是使用VNC远程连接。最近在配置了不知道哪个东西后,树莓派就连不上了,反复重装过几次,经过一番配置之后重启后必然又连不上。后来搞了跟显示器的连接线,启动后发现树莓派进入了”emergency mode“,网上查了下,解决方案对我都不适用,最后我才发现,原来是我在设置自动挂载移动硬盘的时候出错,导致系统启动失败。我的硬盘是NTFS格式的,而树莓派不能直接挂载ntfs格式,需要先安装一个ntfs-3g工具。由于重装过系统,忘记了安装这个,直接将挂载命令写入了fstab文件而又没有验证是否能够挂载成功(毕竟挂载过太多次了,想当然以为没问题了)。

阅读全文 »

alert(28443422041709109)会输出什么?

背景

上一篇博文里我记录了一个诡异的前后端数据不一致的问题,最终定位为前端js精度丢失。但只说了原因及结论并没有深入研究这个问题。
这一篇博文准备在此基础上,深入探寻一番,彻底弄清楚这个问题发生的本质。

引子

让我们先来看几个小问题热热身:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
## js环境下运行,输出结果是什么?
1. console.log(1 === 1.0);

2. console.log(0.1 + 0.2 === 0.3);

3. console.log(9007199254740992);

4. console.log(9007199254740992 + 1);

5. console.log(9007199254740992 + 2);

6. console.log(9007199254740992 + 3);

7. console.log(9007199254740992 + 4);
... ...

浏览器环境下运行下看看是不是有点颠覆了三观?

阅读全文 »

这是我转战JAVA以来的第一篇博文,纪念一下。

背景

组织变动,转战JAVA差不多有一个月了,做了一个小需求,遇到一个诡异的问题。本文记录一下排查经过,顺便提醒自己后续开发中避免这样的坑。

问题描述

JAVA后端需要给前端返回一串数据,其中有个交易订单号,该交易订单在返回给前端后跟后端吐出的值不一致。直观地来看,最后的几个数字被0取代了。
一开始以为取错了交易订单号,然而从DEBUG的过程来看,后端的处理结果没有问题,返回了正确的结果给前端。
如下图所示:

当时也并没有纠结问题的根本原因,下意识地将交易订单号类型从List<Long>换成了List<String>返回就正常了。

发布以后觉得这里可能是个坑,于是研究了一下果然是有缘由的。

阅读全文 »

背景

我们经常需要批量地执行很多mysql命令,这时候如果直接在mysql终端下执行,效率很低。如果借助Shell来进行自动化地操作,则会大大方便我们操作。这里就记录一下我用来进行数据库表重建的方法。

准备mysql脚本

首先我们要准备相应的mysql命令脚本,以便shell调用。
如:

1
2
3
4
5
6
7
8
9
10
11
12
DROP TABLE IF EXISTS `attachment`;
CREATE TABLE `attachment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`init_name` varchar(100) NOT NULL,
`file_path` varchar(100) NOT NULL,
`gmt_create` datetime NOT NULL DEFAULT now(),
`gmt_modified` timestamp NOT NULL DEFAULT now(),
`creator` varchar(100) NOT NULL DEFAULT 'system',
`modifier` varchar(100) NOT NULL DEFAULT 'system',
`is_deleted` char(1) NOT NULL DEFAULT 'N',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=460 DEFAULT CHARSET=utf8;

正常写mysql命令即可。

阅读全文 »

背景

安装Mysql不知道安装了多少次了,但是每次装的时候都要重新查看文档,每次又会遇到不一样的问题。还是记录一下安装步骤吧,省的每次都要重新翻文档了。

安装步骤

以安装mysql5.6版本为例,其他版本可以下载官网对应版本,然后查看附带的INSTALL文档。

  1. 下载
    wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz

  2. 解压并改名
    tar -xvf mysql-5.6.26-linux-glibc2.5-x86_64.tar.gz && mv mysql-5.6.26-linux-glibc2.5-x86_64 mysql

  3. 创建用户组

    1
    2
    3
    4
    5
    #建议将mysql安装在/usr/local目录
    mv mysql /usr/local
    cd mysql
    sudo groupadd mysql
    sudo useradd -r -g mysql mysql
  4. 修改权限

    1
    sudo chown -R mysql:mysql *
    阅读全文 »

已读



“人生在世最大的两个危险,一个是过早死去,另一个是活得太久”。看到这句真的是”振聋发聩”,有多少人期盼长寿,又有多少人会意识到过于长寿可能带来的穷困潦倒的老年生活危机?”理财要趁早,养老计划要趁早”是我读该书获得的收获,至于怎样理财投资,路漫漫其修远。


时生

一如既往的温情,让坐在办公桌前的我都眼泛热泪。”能来到这个世上就已经很美好”,能跟自己的儿子一起胡闹,成长,体验应该不错。也许因为有了孩子之后感触更深,这本书带给我的感动比《解忧杂货铺》更强烈。


无声告白

“我们终此一生,就是要摆脱他人的期待,找到真正的自己”,曾经我也是如同莉迪亚一样在殷切的期望下成长,好在万金油的我能够承受。有时候家庭就是一个人的宿命,我们要做一个好儿子、好丈夫、好父亲,s哪有多少机会去做真正的自己。虽然我现在依然摆脱不了他人的期待,但我希望我以后对下一代的教育不要再像我们的父辈一样,充分引导让孩子选择如何正确地做他自己即可。

阅读全文 »

1. 背景

我的藏经阁网站是部署在aws的虚拟机上的,年前一次访问的时候发现被黑掉了,数据全丢了不说,还被注入了勒索比特币的信息。
逗比的是,年前一直没来及处理,年后过来准备处理时,发现原来被黑过一遍的数据库又被黑了第二遍!勒索比特币数值也从0.1变成了0.2。。

比特币勒索病毒现在非常嚣张,由于比特币交易网络的特殊性,基本上查处不到犯罪分子,中了基本上只能认栽。

2. 安全防护

布置在外网上的服务器,如果不进行安全防护,基本就是暴露于危险环境下的肉鸡。之前购买的搬瓦工虚拟主机也是几次被用来发送恶意邮件。
经过这次数据被黑的惨痛教训,急需补上相应的安全防护。几点简单的防护,可以提升我们的服务免于黑客的攻击。

阅读全文 »