2015-01-13 2 views
0

저는 Java에서 다중 스레드 처리에 대해 새로운 것이므로 이제는 기존 클래스를 사용하여 다중 스레드 모듈을 구현해야합니다. 나는 단일 스레드와 다중 스레드 실행간에 다른 결과를 얻고있다.스레드 안전성에 대한 의문점

public class Worker implements Runnable{ 

    final private int minIndex; // first index, inclusive 
    final private int maxIndex; // last index, exclusive 
    final private MyDTO dto; 
    private MyService myService; 

    public Worker(MyDTO dto) { 
     this.minIndex = dto.getMinIndex(); 
     this.maxIndex = dto.getMaxIndex(); 
     this.dto = dto; 
     myService = new MyService(); 

    } 

    public void run() { 
     int countReg = 0; 
     if(!initErrors){ 

      try { 
       Connection conn = ConnectionFactory.getConnection(); 
       for(int i = minIndex ; i<maxIndex; i++){ 
        myService.executeCalculation(dto,conn); 
        countReg++; 
       } 
       conn.close(); 
      } catch (SQLException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      }   
     } 
    } 


public class MyService{ 


    //It has some method to get object from the database 

    public void executeCalculation(MyDTO dto,Connection conn) { 

     //I do some actions and 
     RegolaDAO regolaDAO = new RegolaDAO(conn); 
     MyObject obj = new MyObject(conn); 
     // I use obj durin the calculation 

     } 
    } 
} 

public class MyObject{ 

    Connection conn; 

    public MyObject (Connection conn){ 
     super(); 
     this.conn = conn; 
    } 
} 

내 서비스는 상태 비 객체이며, MyObject를이 상태 형 객체이며,이 문제를 만들 수있는 동안 다음 문제를 확인해야하지 않습니다 내 주요 의문은 다음과 같다. 내 계산에 새로운 키워드를 사용한 이후의 주요 의심점 MyObject obj = new MyObject(); 이것은 경쟁 조건을 방지하는 데 도움이됩니다.

MyObject는 안전합니까? 구현에 대한 제안 사항을 제공해 줄 수 있습니까?

답변

0

MyObject thread safe? 제 구현에 대한 제안을 해주시겠습니까?

MyObject은 최종 필드가 (myService)이므로 스레드 안전하지 않은 것으로 간주됩니다. 두 스레드가 동일한 MyObject 인스턴스를 사용하고 있다면이 제대로 초기화 된 후에 myService을 사용하여 시작할 수 있습니다. @Peter가 지적한대로 myServicefinal으로하면 특정 문제가 해결됩니다.

if (!initErrors) { 

내가 initErrors가 어떻게 정의를 참조하지 않습니다

코드를 살펴보면, 다음 줄은 그래서 스레드 안전 문제에 대한 후보가 다른 클래스를 호출하고 있습니다. 스레드간에 공유되는 경우 volatile 또는 AtomicBooolean이어야합니다.

Connection conn = ConnectionFactory.getConnection(); 

ConnectionFactory은 스레드로부터 안전한가요? 한 번에 여러 스레드에서 호출 할 수 있습니까?

myService.executeCalculation(dto, conn); 

executeCalculation(...) 메서드에 대해 동일한 질문이 표시됩니다. 또한 @Peter가 지적한 것처럼 dto이 서비스에서 사용되고 있습니다. 서비스가 dto 인스턴스를 변경하면 동기화해야합니다.

1

myService은 변경되지 않으므로 최종 변경을 할 수 있습니다.

dto이 스레드간에 공유 된 것처럼 보입니다. 읽기 전용인지 확인합니다.

또한 은 executeCalculation으로 전달되는데이 필드를 사용하지 않아야합니다.

+0

내 질문이 업데이트되었습니다. MyObject에 대해 어떻게 생각하십니까? – Skizzo

+0

@Skizzo 스레드간에 공유되는 것이 없으면 (코드에서 알 수 있듯이) '다중 스레드 문제가 발생합니다. 문제가있는 경우, 그것이 무엇인지 모를지라도, 어떤 것이 공유되고 있음을 의미합니다. –

+0

당신이 말한 곳에서 당신이 의도 한 것은 무엇입니까 * 당신의 dto가 쓰레드들 사이에 공유되어있는 것으로 보입니다, 나는 그것도 읽기 전용인지 점검 할 것입니다. 어떻게 할 수 있습니까? – Skizzo