아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
태평한고래14
태평한고래1419.03.17

synchronized관련 질문 드립니다

안녕하세요

질문하고자 하는 내용은 a,b두사람이 머 혹은 여러사람이 웹상에 똑같은 페이지에 접근을 했을경우 그 페이지에서 호출하는 클레스의 메소드에 락을 걸려면 어떻게 해야 하는가 하는것 입니다.

예를 들자면

a.jsp에서

<jsp:useBean id="myClass" class="com.bean.MyClass"/>

myClass.myMethod();

와 같이 사용을 하구요

MyClass.java에서는

package com.bean;

public class MyClass{

.....

public void myMethod(){

디비에서 값 불러와서 증가시키고 출력하고 저장하기...

}

......

}

위와 같을경우 제가 원하는 결과는 출력되는 값이 중복되지 않게 숫자가 증가하면서 출력하는 것입니다.

그래서 제가 생각한 방법은

public synchronized void myMethod(){

디비에서 값 불러와서 증가시키고 출력하고 저장하기...

}

이렇게 하면 될거라 생각 했는데 어딘가에서 보니 이렇게 해도 접근한 사용자에게 각각의 MyClass인스턴스가 발생하기 때문에 동기화가 원하는 방법대로 않될거라고 하더군요.

하나의 myClass라는 인스턴스 가지고 여러 사용자가 사용한다면 위의 방법이 원하는 데로 동작 하는데 사용자 별로 별개의 myClass가 생성이 되어서 각자 돌아 가는거라 synchronized가 의미가 없어지게 된다고...

그렇다고 그 메소드 하나 때문에 클래스를 static으로 선언하는건 아닐것 같구요

이럴경우 어떻게 해야 하나요??

55글자 더 채워주세요.
답변의 개수
1개의 답변이 있어요!
  • package com.bean; public class MyClass { private static Object mutex = new Object(); // ..... public void myMethod() { synchronized(mutex) { // 디비에서 값 불러와서 증가시키고 출력하고 저장하기... } } //...... }

    synchronized 메서드는 그 객체로 락을 걸지만

    synchronized 블럭을 사용하면 원하는 객체로 락을 걸 수 있습니다.

    Mutex로 쓸 static 변수(객체)를 하나 만들어서

    synchronized에 그 객체를 쓰시면 됩니다!