精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JDK的一個Bug,監聽文件變更要小心了

開發 前端
本文實踐了一個很常見的功能,起初采用很符合常規思路的方案來解決,結果恰好碰到了JDK的Bug,只好變更策略來實現。

背景

在某些業務場景下,我們需要自己實現文件內容變更監聽的功能,比如:監聽某個文件是否發生變更,當變更時重新加載文件的內容。

看似比較簡單的一個功能,但如果在某些JDK版本下,可能會出現意想不到的Bug。

本篇文章就帶大家簡單實現一個對應的功能,并分析一下對應的Bug和優缺點。

初步實現思路

監聽文件變動并讀取文件,簡單的思路如下:

  • 單起一個線程,定時獲取文件最后更新的時間戳(單位:毫秒);
  • 對比上一次的時間戳,如果不一致,則說明文件被改動,則重新進行加載;

這里寫一個簡單功能實現(不包含定時任務部分)的demo:

public class FileWatchDemo {

/**
* 上次更新時間
*/
public static long LAST_TIME = 0L;

public static void main(String[] args) throws IOException {

String fileName = "/Users/zzs/temp/1.txt";
// 創建文件,僅為實例,實踐中由其他程序觸發文件的變更
createFile(fileName);

// 執行2次
for (int i = 0; i < 2; i++) {
long timestamp = readLastModified(fileName);
if (timestamp != LAST_TIME) {
System.out.println("文件已被更新:" + timestamp);
LAST_TIME = timestamp;
// 重新加載,文件內容
} else {
System.out.println("文件未更新");
}
}
}

public static void createFile(String fileName) throws IOException {
File file = new File(fileName);
if (!file.exists()) {
boolean result = file.createNewFile();
System.out.println("創建文件:" + result);
}
}

public static long readLastModified(String fileName) {
File file = new File(fileName);
return file.lastModified();
}
}

在上述代碼中,先創建一個文件(方便測試),然后兩次讀取文件的修改時間,并用LAST_TIME記錄上次修改時間。如果文件的最新更改時間與上一次不一致,則更新修改時間,并進行業務處理。

示例代碼中for循環兩次,便是為了演示變更與不變更的兩種情況。執行程序,打印日志如下:

文件已被更新:1653557504000
文件未更新

執行結果符合預期。

這種解決方案很明顯有兩個缺點:

  • 無法實時感知文件的變動,程序輪訓畢竟有一個時間差;
  • lastModified返回的時間單位是毫秒,如果同一毫秒內容出現兩次改動,而定時任務查詢時恰好落在兩次變動之間,則后一次變動則無法被感知到。

第一個缺點,對業務的影響不大;第二個缺點的概率比較小,可以忽略不計;

JDK的Bug登場

上面的代碼實現,正常情況下是沒什么問題的,但如果你使用的Java版本為8或9時,則可能出現意想不到的Bug,這是由JDK本身的Bug導致的。

編號為JDK-8177809的Bug是這樣描述的:

Bug地址為:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8177809

這個Bug的基本描述就是:在Java8和9的某些版本下,lastModified方法返回時間戳并不是毫秒,而是秒,也就是說返回結果的后三位始終為0。

我們來寫一個程序驗證一下:

public class FileReadDemo {

public static void main(String[] args) throws IOException, InterruptedException {

String fileName = "/Users/zzs/temp/1.txt";
// 創建文件
createFile(fileName);

for (int i = 0; i < 10; i++) {
// 向文件內寫入數據
writeToFile(fileName);
// 讀取文件修改時間
long timestamp = readLastModified(fileName);
System.out.println("文件修改時間:" + timestamp);
// 睡眠100ms
Thread.sleep(100);
}
}

public static void createFile(String fileName) throws IOException {
File file = new File(fileName);
if (!file.exists()) {
boolean result = file.createNewFile();
System.out.println("創建文件:" + result);
}
}

public static void writeToFile(String fileName) throws IOException {
FileWriter fileWriter = new FileWriter(fileName);
// 寫入隨機數字
fileWriter.write(new Random(1000).nextInt());
fileWriter.close();
}

public static long readLastModified(String fileName) {
File file = new File(fileName);
return file.lastModified();
}
}

在上述代碼中,先創建一個文件,然后在for循環中不停的向文件寫入內容,并讀取修改時間。每次操作睡眠100ms。這樣,同一秒就可以多次寫文件和讀修改時間。

執行結果如下:

文件修改時間:1653558619000
文件修改時間:1653558619000
文件修改時間:1653558619000
文件修改時間:1653558619000
文件修改時間:1653558619000
文件修改時間:1653558619000
文件修改時間:1653558620000
文件修改時間:1653558620000
文件修改時間:1653558620000
文件修改時間:1653558620000

修改了10次文件的內容,只感知到了2次。JDK的這個bug讓這種實現方式的第2個缺點無限放大了,同一秒發生變更的概率可比同一毫秒發生的概率要大太多了。

PS:在官方Bug描述中提到可以通過Files.getLastModifiedTime來實現獲取時間戳,但筆者驗證的結果是依舊無效,可能不同版本有不同的表現吧。

更新解決方案

Java 8目前是主流版本,不可能因為JDK的該bug就換JDK吧。所以,我們要通過其他方式來實現這個業務功能,那就是新增一個用來記錄文件版本(version)的文件(或其他存儲方式)。這個version的值,可在寫文件時按照遞增生成版本號,也可以通過對文件的內容做MD5計算獲得。

如果能保證版本順序生成,使用時只需讀取版本文件中的值進行比對即可,如果變更則重新加載,如果未變更則不做處理。

如果使用MD5的形式,則需考慮MD5算法的性能,以及MD5結果的碰撞(概率很小,可以忽略)。

下面以版本的形式來展示一下demo:

public class FileReadVersionDemo {

public static int version = 0;

public static void main(String[] args) throws IOException, InterruptedException {

String fileName = "/Users/zzs/temp/1.txt";
String versionName = "/Users/zzs/temp/version.txt";
// 創建文件
createFile(fileName);
createFile(versionName);

for (int i = 1; i < 10; i++) {
// 向文件內寫入數據
writeToFile(fileName);
// 同時寫入版本
writeToFile(versionName, i);
// 監聽器讀取文件版本
int fileVersion = Integer.parseInt(readOneLineFromFile(versionName));
if (version == fileVersion) {
System.out.println("版本未變更");
} else {
System.out.println("版本已變化,進行業務處理");
}
// 睡眠100ms
Thread.sleep(100);
}
}

public static void createFile(String fileName) throws IOException {
File file = new File(fileName);
if (!file.exists()) {
boolean result = file.createNewFile();
System.out.println("創建文件:" + result);
}
}

public static void writeToFile(String fileName) throws IOException {
writeToFile(fileName, new Random(1000).nextInt());
}

public static void writeToFile(String fileName, int version) throws IOException {
FileWriter fileWriter = new FileWriter(fileName);
fileWriter.write(version +"");
fileWriter.close();
}

public static String readOneLineFromFile(String fileName) {
File file = new File(fileName);
String tempString = null;
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
//一次讀一行,讀入null時文件結束
tempString = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return tempString;
}
}

執行上述代碼,打印日志如下:

版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理
版本已變化,進行業務處理

可以看到,每次文件變更都能夠感知到。當然,上述代碼只是示例,在使用的過程中還是需要更多地完善邏輯。

小結

本文實踐了一個很常見的功能,起初采用很符合常規思路的方案來解決,結果恰好碰到了JDK的Bug,只好變更策略來實現。當然,如果業務環境中已經存在了一些基礎的中間件還有更多解決方案。

而通過本篇文章我們學到了JDK Bug導致的連鎖反應,同時也見證了:實踐見真知。很多技術方案是否可行,還是需要經得起實踐的考驗才行。趕快檢查一下你的代碼實現,是否命中該Bug?

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2022-05-16 08:42:26

Pandasbug

2021-09-13 08:41:52

職場互聯網自閉

2020-01-10 09:20:03

手機ISOJDK

2018-06-20 15:50:38

JDK9JVMJDK10

2020-09-29 07:44:20

跨域前后端分離插件

2009-09-14 17:08:02

WebFormView

2025-02-13 07:00:00

Dubbo-goJava服務端

2021-04-22 07:47:47

JavaJDKMYSQL

2022-11-30 09:18:51

JavaMyBatisMQ

2022-05-10 12:20:04

JDKversion故障

2021-10-08 07:50:57

軟件設計程序

2011-07-29 16:55:44

Java 7

2017-10-10 15:14:23

BUGiOS 11蘋果

2015-01-23 10:04:56

bug程序員

2016-09-28 14:00:56

2023-01-26 11:43:03

線程池CPUJava

2024-10-25 12:38:27

2023-06-20 08:25:53

NESTED源碼mybatis

2014-12-17 09:40:22

dockerLinuxPaaS

2024-04-22 00:00:01

Redis集群
點贊
收藏

51CTO技術棧公眾號

欧美在线视频观看| 日韩av在线资源| 天天想你在线观看完整版电影免费| 国产探花精品一区二区| 激情久久久久| 一本一本久久a久久精品综合小说| 日本人69视频| 九色porny自拍视频在线播放| 国产亚洲美州欧州综合国| 亚洲aa中文字幕| 日本道在线观看| 欧美黄色大片在线观看| 亚洲精品ady| 久久人人爽av| 超碰一区二区| 亚洲精品成a人| 欧美一区二视频在线免费观看| 国产精品欧美久久久久天天影视| 亚洲久久成人| 久久久成人精品视频| 少妇真人直播免费视频| 久久精品九色| 欧美日韩中文另类| 日日橹狠狠爱欧美超碰| 超碰个人在线| 国产偷国产偷亚洲高清人白洁 | 色妞一区二区三区| 一边摸一边做爽的视频17国产| 国产精品久久久久77777丨| 午夜久久福利影院| 久久久国内精品| 日本高清视频在线观看| 国产亚洲一二三区| 国内外成人免费视频| 国产免费无遮挡| 蜜桃av一区二区在线观看 | 日韩中文字幕在线不卡| www亚洲人| 国产亚洲短视频| 久久久久久久久一区| 欧美性猛交 xxxx| 国产精品一区三区| 91网站在线看| 国产精品国产精品国产专区| 日韩成人一区二区| 国产精品成久久久久三级| 久久国产精品免费看| 一区二区视频欧美| 91精品91久久久久久| 国产一级在线免费观看| 欧美激情1区2区| 欧美成人激情在线| 欧美极品视频在线观看| 午夜久久一区| 久久久免费在线观看| 欧美黄色一级网站| 亚洲午夜伦理| 韩国美女主播一区| 久久中文字幕免费| 久久蜜桃精品| 国产精品久久中文| 在线视频 91| 麻豆视频一区二区| 成人精品aaaa网站| 国产黄色一区二区| 粉嫩av一区二区三区在线播放 | 国产一区二区三区成人| 久久av老司机精品网站导航| 91视频国产精品| 黄色成人一级片| 99久久精品国产毛片| 久久精品五月婷婷| yiren22亚洲综合伊人22| 国产精品成人午夜| 日韩欧美视频免费在线观看| av丝袜在线| 色欧美88888久久久久久影院| 又色又爽又高潮免费视频国产| 日韩色淫视频| 欧美一区二区视频在线观看2022| 国产性猛交96| 伊人成综合网伊人222| 在线观看日韩视频| 国产乱国产乱老熟300| 国产精品毛片在线| 成人h片在线播放免费网站| 国产丝袜视频在线观看| 91在线云播放| 亚洲第一页在线视频| 国内在线免费视频| 欧美午夜电影在线播放| 精品国产午夜福利在线观看| 丝袜av一区| 久久九九热免费视频| 欧美一级片免费在线观看| 美女任你摸久久| 国产精品三区www17con| 成人av一区| 亚洲国产欧美日韩另类综合| 亚洲精品怡红院| 中文无码日韩欧| 亚洲社区在线观看| 久久人人爽人人爽人人| 日韩中文字幕1| 国产一区在线观| 精品麻豆一区二区三区| 色婷婷av一区二区| 国产a√精品区二区三区四区| 欧美日韩第一| 91av视频在线观看| jlzzjlzzjlzz亚洲人| 久久精品水蜜桃av综合天堂| 久久人人爽人人爽人人av| 国产福利一区二区三区在线播放| 亚洲国产精品久久久久久| 伊人在线视频观看| 奇米综合一区二区三区精品视频| 国产女主播一区二区三区| 在线观看免费高清完整| 色综合久久久久综合体桃花网| 久久久久无码精品| 色呦哟—国产精品| 国产精品久久网| 九色视频网站在线观看| 精品国产31久久久久久| 女人扒开双腿让男人捅| 99久久99热这里只有精品| 午夜精品一区二区三区在线播放| 国产精品国产三级国产aⅴ| 国产欧美日韩视频在线观看| 337p粉嫩大胆噜噜噜鲁| 高清欧美性猛交xxxx黑人猛| 裸体女人亚洲精品一区| www.亚洲激情| 国产亚洲欧美日韩在线一区| 欧美日韩激情视频在线观看| 国产精品毛片久久久| xvideos国产精品| 免费一级a毛片| 久久久久久久电影| 成年人在线看片| 国产亚洲一区二区三区不卡| 2018日韩中文字幕| 四虎精品一区二区三区| 亚洲成人免费在线观看| 国产精品熟妇一区二区三区四区 | 欧美成人午夜激情| 91资源在线视频| 椎名由奈av一区二区三区| 亚洲77777| 99热精品久久| 91最新国产视频| 在线观看免费视频你懂的| 91麻豆精品国产91久久久更新时间| 影音先锋男人看片资源| 久久se精品一区二区| 日本黄色播放器| 日韩三级精品| 午夜精品www| 欧美日韩国产综合视频| 欧美性做爰猛烈叫床潮| 四虎影视一区二区| 国产精品中文字幕欧美| 精品一二三四五区| 婷婷成人在线| 国产精品69精品一区二区三区| www 日韩| 欧美一区二区三区视频免费播放| 欧美成人一二三区| 波波电影院一区二区三区| 国产精品视频一区二区三区四区五区| 久久99蜜桃| 成人xvideos免费视频| 在线观看av免费| 亚洲精品国产精品国自产观看浪潮| 久久黄色精品视频| 中文字幕欧美国产| 国产黄色一区二区三区| 亚洲欧美bt| 亚洲欧洲一二三| 99re91这里只有精品| 久久免费精品视频| 国产尤物视频在线| 日韩一级完整毛片| 青青草免费观看视频| 国产精品视频yy9299一区| 免费观看黄网站| 欧美中文字幕| 亚洲欧美一二三| 久久99偷拍| 国产剧情久久久久久| 蜜臀av在线| 中文字幕日韩av综合精品| 精品国产av一区二区三区| 日韩欧美在线视频观看| 国产精品老熟女一区二区| 91看片淫黄大片一级在线观看| 亚洲免费999| 一区二区日本视频| 亚洲 欧洲 日韩| 婷婷综合福利| 91视频在线免费观看| 日本综合字幕| 欧美激情在线观看| 无遮挡的视频在线观看| 亚洲国产女人aaa毛片在线| 亚洲一线在线观看| 大伊人狠狠躁夜夜躁av一区| 免费在线黄色网| 欧美激情一区二区在线| 插我舔内射18免费视频| 国精品**一区二区三区在线蜜桃| 国产成人无码精品久久久性色| 国产精品久久久久无码av| 欧美精品一区二区三区久久| 欧美日本三级| 国产欧美一区二区三区四区 | 欧美精品国产一区| 亚洲.欧美.日本.国产综合在线| 精品国产一区二区三区成人影院 | 国产精品久久看| 丰满少妇在线观看资源站| 国产成a人亚洲| aaa一级黄色片| 免费av网站大全久久| 能在线观看的av网站| 亚洲免费激情| 国产天堂视频在线观看| 欧美在线免费| 福利网在线观看| 99久久精品国产亚洲精品| 日产国产精品精品a∨| 色综合www| 久久久神马电影| 久草精品视频| 国产私拍一区| xxxx日韩| 国产精品一区免费观看| 9l视频自拍九色9l视频成人| 99久久久精品免费观看国产| 玖玖精品一区| 97久久夜色精品国产九色| 国产精品1区在线| 91嫩草在线视频| 韩国三级成人在线| 91久久精品视频| 国产精品亚洲欧美日韩一区在线 | 网曝91综合精品门事件在线| 国产精品免费在线播放| 57pao国产一区二区| 国产精品二区二区三区| 成人搞黄视频| 国产精品一区二区a| 精品精品国产毛片在线看| 国产青春久久久国产毛片| 国内自拍欧美| 久久亚洲一区二区| 欧美日韩黑人| 婷婷视频在线播放| 欧美成人首页| 国产精品专区在线| 久久精品亚洲| 国产精品久久久毛片| 国产一区久久久| 亚洲乱妇老熟女爽到高潮的片| 成人福利视频在线| theav精尽人亡av| 国产欧美日韩在线观看| 欧美日韩国产一二三区| 亚洲黄色录像片| 国产成人精品一区二三区| 在线精品视频免费观看| 91肉色超薄丝袜脚交一区二区| 91精品麻豆日日躁夜夜躁| 精品人妻一区二区三区换脸明星| 亚洲福利在线播放| 国产日产精品久久久久久婷婷| 色青青草原桃花久久综合| 欧美xxxx免费虐| 欧美在线性爱视频 | 欧美日韩国产免费一区二区| 国产高清免费av| 日韩成人在线视频网站| 天天影视久久综合| 久久久亚洲欧洲日产国码aⅴ| 成人影院大全| 91在线无精精品一区二区| 国产精品毛片久久久| 神马影院一区二区三区| 欧美96在线丨欧| 亚洲熟妇av一区二区三区| 极品少妇一区二区三区精品视频| 亚洲成a人片在线www| 中文子幕无线码一区tr| 久久久久久久久精| 色婷婷亚洲综合| 午夜精品久久久久久久96蜜桃| 亚洲美女激情视频| 午夜伦理在线视频| 国产精品久久久久久久一区探花| 亚洲综合影院| 性欧美精品一区二区三区在线播放| 欧美片第1页综合| 天堂av在线网站| av亚洲精华国产精华精华| 亚洲伦理一区二区三区| 色综合久久99| 好吊色一区二区| 北条麻妃久久精品| 欧美成a人片在线观看久| 国产精品区一区| 亚洲自拍偷拍网| 乌克兰美女av| 91蜜桃免费观看视频| 久久久香蕉视频| 5566中文字幕一区二区电影| 激情福利在线| 欧美亚洲国产成人精品| 中文字幕区一区二区三| 在线国产99| 免费日本视频一区| 精品国产av无码| 亚洲aⅴ怡春院| 精品人妻一区二区三区日产乱码 | 日韩电影在线一区二区三区| 男人的天堂影院| 亚洲精品国产一区二区精华液 | 青娱乐极品盛宴一区二区| 久久亚裔精品欧美| 国产精品久久久亚洲一区| 中文在线观看免费视频| 一区二区三区在线免费视频| 国产巨乳在线观看| xxxxxxxxx欧美| 欧美黄页免费| 亚洲精品在线观看免费| 日本美女视频一区二区| 日韩乱码人妻无码中文字幕久久| 日韩欧美国产中文字幕| 天天操天天操天天| 午夜欧美大片免费观看| 超碰成人免费| 很污的网站在线观看| 成人一区二区三区视频在线观看 | 欧美视频在线观看免费| 天堂在线中文| 4388成人网| 亚洲精品国产精品粉嫩| 日本熟妇人妻xxxxx| 久久久综合精品| 久久精品五月天| 中文字幕不卡av| 亚洲一区有码| 男人j进女人j| 国产91综合一区在线观看| 妺妺窝人体色www在线下载| 欧美tickling网站挠脚心| 免费不卡av| 欧美日韩国产综合视频在线| 毛片一区二区| 亚洲一级黄色录像| 欧美精品三级在线观看| 91在线中字| 国产欧美一区二区三区不卡高清| 另类图片国产| 911国产在线| 日韩欧美国产电影| 国产夫妻在线| 亚洲成人蜜桃| 国产黄人亚洲片| 久久久久久久久影院| 在线观看视频99| 免费一级欧美在线大片| 欧美精品久久久久久久久久久| 久久日韩粉嫩一区二区三区| 伊人久久一区二区| 欧美极品欧美精品欧美视频| 亚洲国产合集| 91小视频在线播放| 午夜精品爽啪视频| www.亚洲视频| 不卡日韩av| 鲁大师影院一区二区三区| 亚洲一二三在线观看| 日韩成人av在线| 成人影院在线免费观看| 伊人再见免费在线观看高清版| 97久久精品人人做人人爽| 在线观看国产小视频| 久久全国免费视频| 美女精品一区最新中文字幕一区二区三区| 狠狠躁狠狠躁视频专区| 亚洲最大成人综合| 激情小说 在线视频| 99国精产品一二二线| 久久久成人网| 激情视频在线播放| 尤物九九久久国产精品的分类| 高清日韩中文字幕| 亚洲xxx在线观看|