鍍金池/ 問答/ Linux問答
生性 回答
git config --global user.name "Your_Username"
git config --global user.email username@xxx.com
撥弦 回答

準(zhǔn)確來說確實(shí)不是針對volatile,而是解決了volatile內(nèi)存可見性帶來的false sharing問題的。如果不是volatile這種問題應(yīng)該不會存在。

具體實(shí)踐中,也是一般針對基本數(shù)據(jù)類型的volatile比較合適,因?yàn)樾芯彌_中的cache line的大小一般也就只有64字節(jié)而已。

除了disruptor框架,你可以查看hystrix和java8中的Long adder

墨小白 回答

嗯。

簡單就是重啟docker: sudo service docker restart

復(fù)雜點(diǎn)使用命令: docker network disconnect -f {network} {endpoint-name}

這里{endpoint-name} 可以使用命令 docker network inspect {network} 獲取,然后docker-compose stop

忠妾 回答

更新 編譯后常量池和字節(jié)碼

默認(rèn)編譯 Java 8 查看編譯后的 class 文件

constant_pool_count 為 146,
其中只有

#005 (String): x12323
#013 (String): 運(yùn)行線程:
#020 (String): :lockObj(
#021 (String): hash code (
#024 (String): ),集合 s 為空嗎:
#026 (String): good
#030 - #052 (UTF-8)
#056 - #058 (UTF-8)
#060 - #061 (UTF-8)
#065 - #066 (UTF-8)
#070 (UTF-8): BootstrapMethods
#078 - #079 (UTF-8)
#087 - #088 (UTF-8)
#091 (String): ),集合 s 為空嗎:
#093 (String): good
#095 - #107 (UTF-8)
#110 - #133 (UTF-8)
#137 - #138 (UTF-8)
#140 - #142 (UTF-8)
#144 - #0145 (UTF-8)

再看字節(jié)碼部分:

clipboard.png

037: aload_0 是從局部變量表里加載0號值
041: ldc #5->x12323 是加載常量池6號值

所以說 classname 不是常量值入棧,個(gè)人猜測是因?yàn)?/p>

有泛型之后,Java 又選擇了泛型擦除,很多東西要等到運(yùn)行時(shí)才能確定,getClass 這個(gè)操作應(yīng)該就是帶有不確定性,所以它的結(jié)果不進(jìn)入常量池。

更新 顯示更多的調(diào)試信息

右擊變量區(qū),點(diǎn)擊 Customize Data Views...

clipboard.png

選你要的,我是全部勾選了。

clipboard.png

原答案

hasCode 一樣并不說明兩個(gè) String 實(shí)例是同一個(gè),String.hashCode只是計(jì)算value值,同樣內(nèi)容的情況下 hashCode 會一樣的。

String lockObj = s.getClass().toString() + id; 后邊加一句打印語句并下斷點(diǎn)。

clipboard.png

第一次循環(huán)時(shí)創(chuàng)建的 lockObj 的內(nèi)存數(shù)據(jù)是這樣的

clipboard.png

這是第二次的內(nèi)存數(shù)據(jù)。

可以看到,這里的兩個(gè) String 的值即使一樣,它們的 value 屬性卻不是同一個(gè)指向。

所以你鎖的對象其實(shí)本就不是同一個(gè),把 lockObj 的聲明放到循環(huán)外部后你鎖的才是同一個(gè)對象。

個(gè)人猜測:

你的 lockObj 是一個(gè)依賴運(yùn)行時(shí)變量hashCode而拼接的字符串,而且不是常量字符串的拼接,也就是說編譯器無法在編譯期優(yōu)化掉它,也就不會在字符串池里放這個(gè)。

也就是說,每次循環(huán)時(shí) JVM 會重新創(chuàng)建一個(gè) byte[],這就導(dǎo)致了每次 lockObj 實(shí)際上不是同一個(gè)實(shí)例。

兔囡囡 回答

為何非要這么啟動(dòng),用service manager管理不好嗎?操作系統(tǒng)自帶,絕對官方最佳實(shí)踐。

service vsftpd start
青檸 回答

curl會用一個(gè)子線程去做DNS查詢,所以要用strace -f才能看到。

大概看了一下curl的代碼,DNS解析有多種實(shí)現(xiàn),我用的版本是用線程實(shí)現(xiàn)的異步DNS,但最終執(zhí)行解析的都是curl_addrinfo.cCurl_getaddrinfo_ex函數(shù),里面會調(diào)用getaddrinfo獲得IP列表。

懶豬 回答

容器中安裝不了,可以容器外安裝啊,容器外弄好后自己封裝鏡像,然后拉進(jìn)docker。

枕邊人 回答

參考官方文檔

public static ExecutorService newFixedThreadPool(int nThreads)
創(chuàng)建一個(gè)線程池, 在重用共享無界隊(duì)列中運(yùn)行的固定線程數(shù)。在任何時(shí)候, nThreads 個(gè)線程都將是活動(dòng)的處理任務(wù)。如果在所有線程都處于活動(dòng)狀態(tài)時(shí)提交了其他任務(wù), 則它們將在隊(duì)列中等待, 直到線程可用為止。如果由于在關(guān)閉前執(zhí)行過程中出現(xiàn)故障而終止了任何線程, 則如果需要執(zhí)行后續(xù)任務(wù), 則新項(xiàng)將取代它。池中的線程將存在, 直到顯式關(guān)閉為止。

可以用下面的程序測試

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;

public class ThreadPoolTest1 {
    
    static class MyTask implements Runnable {
        private String name;
        
        public MyTask(String name){
            this.name = name;
        }

        
        @Override
        public void run() {
            for (int i = 0; i < 2; i++) {
                // 做點(diǎn)事情
                try {
                    Thread.sleep(100);
                    if(System.currentTimeMillis() % 3 == 0 ){
                         System.out.println("stop!");
                         throw  new RuntimeException("break!"); //(1)注釋掉這一行將只有兩個(gè)Thread!
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name + " said:" + i+" Thread="+Thread.currentThread().getName());
            }
        }
    }

    
    public static void main(String[] args) {
        // 創(chuàng)建線程池
//        ExecutorService threadPool = Executors.newSingleThreadExecutor();
        ExecutorService threadPool = Executors.newFixedThreadPool(2);
//        ExecutorService threadPool = Executors.newCachedThreadPool();

        
        // 向線程池里面扔任務(wù)
        for (int i = 0; i < 10; i++) {
            threadPool.execute(new MyTask("Task" + i));
        }

        
        // 關(guān)閉線程池
        threadPool.shutdown();
    }
}

注釋掉(1)處的異常會得到正常結(jié)果

Task0 said:0 Thread=pool-1-thread-1
Task1 said:0 Thread=pool-1-thread-2
Task0 said:1 Thread=pool-1-thread-1
Task1 said:1 Thread=pool-1-thread-2
Task2 said:0 Thread=pool-1-thread-1
Task3 said:0 Thread=pool-1-thread-2
Task2 said:1 Thread=pool-1-thread-1
Task3 said:1 Thread=pool-1-thread-2
......

任務(wù)將在thread 1和2之間切換
拋出異常RuntimeException會看到如下的情況:

.......
java.lang.RuntimeException: break!
    at ThreadPoolTest1$MyTask.run(ThreadPoolTest1.java:22)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Task4 said:0 Thread=pool-1-thread-5
Task5 said:0 Thread=pool-1-thread-6
......

能看到線程池在不斷創(chuàng)建新的線程.

乖乖噠 回答

監(jiān)聽127.0.0.1就好了。ddos和這個(gè)沒關(guān)系,要看具體是ddos什么

溫衫 回答

找到原因了,F(xiàn)TP服務(wù)器是在Linux系統(tǒng)下搭建的,有 . 和 ..兩個(gè)文件,后續(xù)邏輯判斷導(dǎo)致異常,但是沒拋出異常,這個(gè)異常我自己處理了 哭笑~

心夠野 回答

和 redis 沒有任何關(guān)系,只要你把 session 的驅(qū)動(dòng)設(shè)置為 redis 就行了。
SessionManager 統(tǒng)一了使用方法。可以使用助手函數(shù) session(''); 就行了

莫小染 回答

說說我淺薄的認(rèn)識,請大神們指正。

你跑著的Nginx容器并不是使用的你宿主機(jī)(mac)的內(nèi)核,因?yàn)閐ocker所依賴的namespaces、cgroups的功能在你的宿主機(jī)上并沒有。你能在mac上跑docker容器,是因?yàn)橐粋€(gè)名叫Docker.app的程序提供了一層抽象,它介于宿主機(jī)和docker之間,提供了容器所倚賴的Linux的namespaces、cgroups等功能。

在Linux上跑著的各個(gè)docker容器是真的共享了Linux內(nèi)核,但mac上跑著的各個(gè)docker容器并不是共享了mac的內(nèi)核。換個(gè)角度,從github上把docker的源代碼克隆下來并編譯,編譯得到的二進(jìn)制程序并不能直接跑在mac上。

ubuntu這類docker鏡像中并不包含Linux內(nèi)核,反過來想,要是包含了Linux內(nèi)核這個(gè)鏡像大小肯定不止這點(diǎn)。

臭榴蓮 回答

那你都知道了還在問什么...

java 類的元數(shù)據(jù)在內(nèi)存只存在一份,放在 Permanent Generation space 中,反射出來的方法、字段也只有一份。

SVN的BUG多得是

建議換成GIT

淚染裳 回答

其實(shí)這就是一個(gè)典型的粘包、拆包的問題。

導(dǎo)致的原因就是因?yàn)?TCP 是流式的,就像水流一樣沒法知道一段完整的報(bào)文到哪里是截止的。

報(bào)文越長就越可能出現(xiàn)這樣的問題。

文中提到的其實(shí)是按照字節(jié)長度來防止拆包,常見的還有通過分隔符,比如知道讀取到指定的分隔符才算做是獲取到了完整的報(bào)文。

這些其實(shí) Netty 都是有內(nèi)置的處理器。

熟稔 回答

訪問路由給對方,過來方法直接獲取$_POST即可啊

巫婆 回答

圖二 ,服務(wù)器端PHP版本過高,因?yàn)樵赑HP7中已經(jīng)完全移除了mysql_*系列函數(shù),導(dǎo)致函數(shù)不存在錯(cuò)誤。

撥弦 回答

2個(gè)思路:讓線上服務(wù)器直接訪問倉庫的路徑;或者直接提交到服務(wù)器。

熟稔 回答

1,如果頁面數(shù)據(jù)沒事刷新的話,你可以引入ChangeDetectorRef 強(qiáng)制刷新,2,字符串首尾去空格str.trim()