Java FileLock для чтения и записи

Я бы порекомендовал использовать пример, изложенный в репозитории github 14. НЛП-с-отправка . Код в учебнике, на который вы ссылаетесь, довольно прост, поэтому его можно сжать в один файл. Он предназначен только для того, чтобы показать, как можно использовать маршрутизацию для нескольких моделей LUIS и / или QnA . Образец Github более устойчив, демонстрируя дальнейшую настройку.

22
задан Jon Seigel 20 March 2010 в 19:44
поделиться

3 ответа

Из опыта я могу дать вам простой ответ: Всегда порождать задачу с VX_FP_TASK. Особенно, если код можно использовать для различных архитектур.

В зависимости от компилятора (gnu, diab), используемых флагов компиляции и архитектуры регистры с плавающей точки могут использоваться не только для операций с плавающей точкой. В большинстве архитектур регистры FP больше обычных регистров, поэтому они превращаются в идеальных кандидатов для оптимизации кода.

Например, в процессорах PPC603, если вы используете C++ вместо обычного C, регистры FP будут использоваться для оптимизации, и если у вас нет включенной VX_FP_TASK для этой задачи, это может повредить регистры FP другой задачи, даже если она не производит никаких вычислений!

Правильное выполнение более важно, чем производительность, и в большинстве случаев увеличение производительности не оправдывает риск, связанный с его отключением.

Если необходимо убедиться, что флаг включен для всех задач, рекомендуется добавить крючок, который всегда активирует флаг во время создания задачи с помощью TaskCreateTaxingAdd ()

-121--4746241-

OK, на всякий случай, если кто-либо еще попадет в это, при вызове веб-служб через автоматически сгенерированные тестовые страницы пользовательские сериализаторы не вызываются - они обходятся. Это, видимо, по замыслу.

-121--4529272-

(a) Знаете ли вы, что блокировка файла не помешает другим процессам прикоснуться к нему, если они также не используют блокировки?
(б) Вы должны заблокировать по записываемому каналу. Получите блокировку с помощью RandomStartFile в режиме «rw», а затем откройте FileInputStream . Обязательно закройте оба!

17
ответ дан 29 November 2019 в 05:18
поделиться

Я записал тестовую программу и команды удара для подтверждения эффективности блокировки файла:

import java.io.File;
import java.io.RandomAccessFile;
import java.nio.channels.FileLock;

public class FileWriterTest
{
    public static void main(String[] args) throws Exception
    {
        if (args.length != 4)
        {
            System.out.println("Usage: FileWriterTest <filename> <string> <sleep ms> <enable lock>");
            System.exit(1);
        }

        String filename = args[0];
        String data = args[1];
        int sleep = Integer.parseInt(args[2]);
        boolean enableLock = Boolean.parseBoolean(args[3]);

        try (RandomAccessFile raFile = new RandomAccessFile(new File(filename), "rw"))
        {
            FileLock lock = null;
            if (enableLock)
            {
                lock = raFile.getChannel().lock();
            }

            Thread.sleep(sleep);
            raFile.seek(raFile.length());
            System.out.println("writing " + data + " in a new line; current pointer = " + raFile.getFilePointer());
            raFile.write((data+"\n").getBytes());

            if (lock != null)
            {
                lock.release();
            }
        }
    }
}

Выполнение с этой командой удара для проверки его работает:

for i in {1..1000}
do
java FileWriterTest test.txt $i 10 true &
done

необходимо видеть запись, только происходящую один раз в 10 мс (от выводов), и в конце все числа для присутствования в файле.

Вывод:

/tmp wc -l test.txt
1000 test.txt
/tmp

тот же тест без блокировки показывает потерянные данные:

for i in {1..1000}
do
java FileWriterTest test.txt $i 10 false &
done

Вывод:

/tmp wc -l test.txt
764 test.txt
/tmp

должно быть легко изменить его для тестирования tryLock вместо этого.

0
ответ дан 29 November 2019 в 05:18
поделиться

Было бы лучше, если бы вы создали блокировку с помощью tryLock (0L, Long.MAX_VALUE, true) .

Это создает разделяемую блокировку, которая является правильным решением для чтения.

tryLock () является сокращением для tryLock (0L, Long.MAX_VALUE, false) , то есть запрашивает исключительную блокировку записи.

13
ответ дан 29 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: