У меня есть класс, в котором есть переменная boolean
, называемая isbeingwritten
. Он отслеживает, записывается ли файл. Функция этого класса вызывает несколько потоков, которые записываются в файлы. они сначала проверит значение переменной isbeingwritten
, и если это false
, установите ее на true
и начните писать, иначе они будут ждать. По окончании записи они изменят значение на false
. Должна ли эта переменная быть сделана volatile
?Может ли переменная быть изменчивой?
class A
{
public boolean isbeingwrittenfalse;
public void func()
{
new thread1();
new thread2();
}
class thread1 implements Runnable
{
Thread t;
thread1()
{
t=new Thread (this);
t.start();
}
public void run()
{
while(isbeingwritten);
isbeingwritten=true;
//wrrite very long string
isbeingwritten=false;
}
}
class thread2 implements Runnable
{
Thread t;
thread2()
{
t=new Thread (this);
t.start();
}
public void run()
{
while(isbeingwritten);
isbeingwritten=true;
//wrrite very long string
isbeingwritten=false;
}
}
Ниже правильное решение
public class XSSThread implements Runnable {
Thread xt;
public void init() {
xt = new Thread(this);
xt.start();
}
public void run() {
new Thread1().init();
new Thread2().init();
}
public synchronized void saveToFile(String a) {
File aFile = new File("filename.txt");
try {
BufferedWriter out = new BufferedWriter(new FileWriter(aFile, aFile.exists()));
out.write(a + "\r\n");
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Thread1 extends XSSThread implements Runnable{
Thread xt1;
public void init() {
xt1 = new Thread(this);
xt1.start();
}
public void run() {
String a;//very long string
saveToFile(a);
}
}
public class Thread2 extends XSSThread implements Runnable {
Thread xt2;
public void init() {
xt2 = new Thread(this);
xt2.start();
}
public void run() {
String a;//very long string
saveToFile(a);
}
}
Синхронизация правильная. Однако вы не должны полностью менять вопрос, потому что это затрудняет сравнение других с ответами. Пожалуйста, измените его снова, чтобы он содержал как исходный, так и пересмотренный вопрос. – nosid