我正在學習java線程,我寫了下面的代碼並嘗試運行此代碼。我沒有使用任何同步概念,但輸出格式一致。請幫我弄清楚實際的原因。爲什麼代碼遵循同步?
package check;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
public class Hello {
public static void main(String[] args) throws FileNotFoundException, IOException {
Write write = new Write();
String str[] = new String[5];
String str2[] = new String[5];
for (int i = 0 ; i < 5; i ++) {
str[i] = System.getProperty("line.separator") + " hello this is a new line written at " + new Date().toString();
str2[i] = System.getProperty("line.separator") + " this is code after new line " + new Date().toString();
}
new Th(str, write).start();
new Th(str2 , write).start();
}
}
class Th extends Thread {
private String[] message;
private Write write;
Th(String[] message, Write write) {
this.message = message;
this.write = write;
}
public void run() {
try {
write.write(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Write {
public void write(String[] message) throws IOException {
FileWriter fileWriter = null;
BufferedWriter bufferedWriter = null;
try {
fileWriter = new FileWriter("d:/a.txt", true);
bufferedWriter = new BufferedWriter(fileWriter);
for (String msg : message) {
System.out.println(Thread.currentThread().getName());
bufferedWriter.write(msg);
Thread.sleep(500);
}
} catch (Exception e) {
System.out.println(e);
} finally {
bufferedWriter.close();
fileWriter.close();
}
}
}
我知道,寫Writer類使用同步塊的方法在內部想:
public void write(String str, int off, int len) throws IOException {
synchronized (lock) {
char cbuf[];
if (len <= WRITE_BUFFER_SIZE) {
if (writeBuffer == null) {
writeBuffer = new char[WRITE_BUFFER_SIZE];
}
cbuf = writeBuffer;
} else { // Don't permanently allocate very large buffers.
cbuf = new char[len];
}
str.getChars(off, (off + len), cbuf, 0);
write(cbuf, 0, len);
}
}
我的程序的輸出是:
this is code after new line Thu Mar 16 19:33:07 IST 2017
this is code after new line Thu Mar 16 19:33:07 IST 2017
this is code after new line Thu Mar 16 19:33:07 IST 2017
this is code after new line Thu Mar 16 19:33:07 IST 2017
this is code after new line Thu Mar 16 19:33:07 IST 2017
hello this is a new line written at Thu Mar 16 19:33:07 IST 2017
hello this is a new line written at Thu Mar 16 19:33:07 IST 2017
hello this is a new line written at Thu Mar 16 19:33:07 IST 2017
hello this is a new line written at Thu Mar 16 19:33:07 IST 2017
hello this is a new line written at Thu Mar 16 19:33:07 IST 2017
我的問題是:爲什麼不是第二個線程寫入第一個線程從寫入方法的同步塊出來後的數據。 謝謝:)
沒有'synchronized'關鍵字,它看起來不像你想象的那樣。你的方法根本不同步,所以他們一起工作,但是用「睡眠(500)」,沒有辦法讓一條線打印多條線,然後把手放到另一條線上。 – AxelH
@AxelH我的問題是,爲什麼數據(輸出)是一致的,而不使用同步?爲什麼不是螺紋干涉? –
現在我明白了這個問題,「輸出」來自文件,所以當然這個接口使用BufferedWriter進行同步。看到我編輯的答案瞭解。 – AxelH