Есть ли способ определить, дал ли пользователь разрешение на использование navigator.geolocation?

Ну, без какой-либо детали реализации, это трудно понять, но, как показывает мой тестовый пример, я всегда получаю 220 строк вывода, т. е. постоянное количество строк, с FileWriter. Обратите внимание, что здесь не используется synchronized.

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
 * Working example of synchonous, competitive writing to the same file.
 * @author WesternGun
 *
 */
public class ThreadCompete implements Runnable {
    private FileWriter writer;
    private int status;
    private int counter;
    private boolean stop;
    private String name;


    public ThreadCompete(String name) {
        this.name = name;
        status = 0;
        stop = false;
        // just open the file without appending, to clear content
        try {
            writer = new FileWriter(new File("test.txt"), true);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    public static void main(String[] args) {

        for (int i=0; i<20; i++) {
            new Thread(new ThreadCompete("Thread" + i)).start();
        }
    }

    private int generateRandom(int range) {
        return (int) (Math.random() * range);
    }

    @Override
    public void run() {
        while (!stop) {
            try {
                writer = new FileWriter(new File("test.txt"), true);
                if (status == 0) {
                    writer.write(this.name + ": Begin: " + counter);
                    writer.write(System.lineSeparator());
                    status ++;
                } else if (status == 1) {
                    writer.write(this.name + ": Now we have " + counter + " books!");
                    writer.write(System.lineSeparator());
                    counter++;
                    if (counter > 8) {
                        status = 2;
                    }

                } else if (status == 2) {
                    writer.write(this.name + ": End. " + counter);
                    writer.write(System.lineSeparator());
                    stop = true;
                }
                writer.flush();
                writer.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

Как я понимаю (и тест), в этом процессе есть две фазы:

  • все потоки в пул всех созданных и запущенных, готовый захватить файл;
  • один из них захватывает его, и я предполагаю, что он затем внутренне блокирует его, предотвращает доступ других потоков, потому что я никогда не вижу строки, объединенной с содержимым которые происходят из двух потоков. Поэтому, когда поток пишет, другие ждут, пока он завершит линию, и, скорее всего, выпустит файл. Таким образом, никакого состояния гонки не произойдет.
  • самый быстрый из остальных захватывает файл и начинает писать.

Ну, это точно так же, как толпа, ожидающая снаружи ванной , без очередей .....

Итак, если ваша реализация отличается, покажите код, и мы можем помочь сломать его.

16
задан Community 23 May 2017 в 12:34
поделиться