серийный номер добавить не синхронизирован - PullRequest
0 голосов
/ 25 мая 2018

Я не знаю, после того, как положил везде, я могу представить себе «синхронизированный», но это все еще поток не безопасен, помогите, большое спасибо! Многопоточность претендует на добавление серийного номера «a». Может ли поток запустить метод Демо может бытьсинхронизируется?В любом случае, я добавляю его в "public void run ()" синхронизированный, он по-прежнему отображает небезопасное сообщение.

package stackoverflow;

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

public class NumberEx {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ExecutorService service=Executors.newCachedThreadPool();
        for(int i=0;i<10;i++) {
            service.execute(new ThreadDemo());
        }
        service.shutdown();

    }
}


package stackoverflow;

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class ThreadDemo implements Runnable  {
    private static volatile int a = 0;
    private static volatile List<Integer> list=new ArrayList<Integer>();
    static PrintWriter writer;
    static {
        try {
            writer=new PrintWriter("./src/out.txt");
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void run()  {

         while (a< 1000) {
                //critical section
                a= increment(a);
                //end
         }
            writer.close();

    }

    private static synchronized int increment(int a)  {

        writer.print("<<<<============"+Thread.currentThread().getName()+"========================     ");

        a=a+1;
        Integer temp=new Integer(a);

       writer.print(" Thread["+Thread.currentThread().getName()+"]" + ":"+ a);
       writer.print("      ============="+Thread.currentThread().getName()+"=======================>>>>>    "); 
        if(list.contains(temp)) {
            System.out.println("repeat number"+temp);
            Iterator<Integer> iter=list.iterator();
            while(iter.hasNext()) {
                System.out.print(iter.next()+" ");
            }
            System.exit(0);
        }else {
            list.add(temp);
        }
       writer.println(" "+temp+"\n");

        return a;
    } 

}

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Извините за глупый вопрос, я недавно узнал об объектном мониторе и наконец решил ti с синхронизацией на объекте

0 голосов
/ 25 мая 2018

Я могу ошибаться, но я думаю, что вам нужно окружить

//critical section
a= increment(a);
 //end

синхронизированным блоком и ввести объект блокировки следующим образом:

private static final Object LOCK = new Object();

@Override
public void run() {

    while (true) {
        synchronized (LOCK) {
            if(a<1000){
                //critical section
                a = increment(a);
                //end
            }else{
                break;
            }
        }
    }
}

Необходимо проверить условиетакже внутри синхронизированного блока, в противном случае вы получите числа больше 1000.

Редактировать.предыдущий ответ был неверным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...