* lock flag : 한 프로세스가 작업을 끝내기 전에 다른 프로세스가 접근 하는 것을 막는 것.
* 동기화블럭 실행 예제
1. synchronized가 있을 때 예제
- 하나의 요청이 있는 동안 다른 하나의 요청이 대기하다가 하나의 요청이 끝나면 다른 요청이 실행된다.
/*package servlet.lifecycle;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CounterServlet extends HttpServlet{
//변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.)
private int visitCount;
//카운트 한 값을 저장 시킬 공간
private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.txt";
//생성자( 객체 생성)
public CounterServlet(){
}
//객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기)
public void init(){
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader(counterFile);
bufferedReader = new BufferedReader(fileReader);
String readCount = bufferedReader.readLine();
visitCount = Integer.parseInt(readCount);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(bufferedReader!=null){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//객체 소멸 직전 실행(visitCount 값을 파일로 write)
public void destroy(){
FileWriter fileWriter = null;
PrintWriter printWriter = null;
File file = null;
try {
fileWriter = new FileWriter(counterFile);
printWriter = new PrintWriter(fileWriter,true);
printWriter.println(visitCount);
} catch (IOException e) {
e.printStackTrace();
} finally{
printWriter.close();
}
}
//service() -> doGet() : 클라이언트 요청이 들어올때 마다 호출
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>카운터</title></head>");
out.println("<body>");
visitCount++;//카운터의 값을 1증가
out.println("당신은 "+visitCount+" 번째 방문자 입니다.");
out.println("</body></html>");
}
}
*/
package servlet.lifecycle;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CounterServlet extends HttpServlet{
//변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.)
private int visitCount;
//카운트 한 값을 저장 시킬 공간
//private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.dat";
private String counterFile;
//생성자( 객체 생성)
public CounterServlet(){
}
//객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기)
public void init(){
System.out.println("counterFile : "+counterFile);
ServletConfig conf = getServletConfig();
counterFile = conf.getInitParameter("saveFile");
System.out.println("counterFile : "+counterFile);
DataInputStream dataInputStream = null;
try {
dataInputStream = new DataInputStream(new FileInputStream(counterFile));
visitCount = dataInputStream.readInt();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(dataInputStream!=null){
try {
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//객체 소멸 직전 실행(visitCount 값을 파일로 write)
public void destroy(){
DataOutputStream dataOutputStream = null;
try {
dataOutputStream = new DataOutputStream(new FileOutputStream(counterFile));
dataOutputStream.writeInt(visitCount);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if( dataOutputStream!=null){
try {
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//service() -> doGet() : 클라이언트 요청이 들어올때 마다 호출
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>카운터</title></head>");
out.println("<body>");
synchronized(this){
visitCount++;//카운터의 값을 1증가
try{
Thread.sleep(5000);
}catch(Exception e){
}
out.println("당신은 "+visitCount+" 번째 방문자 입니다.");
}
out.println("</body></html>");
}
}
- 결과
- 동기화블럭 전 count
1. synchronized가 없을 때 실행
하나의 요청이 있는 동안 다른 요청이 들어와서 동시에 같은 결과를 받아 데이터 문제가 발생 된다.
/*package servlet.lifecycle;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CounterServlet extends HttpServlet{
//변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.)
private int visitCount;
//카운트 한 값을 저장 시킬 공간
private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.txt";
//생성자( 객체 생성)
public CounterServlet(){
}
//객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기)
public void init(){
FileReader fileReader = null;
BufferedReader bufferedReader = null;
try {
fileReader = new FileReader(counterFile);
bufferedReader = new BufferedReader(fileReader);
String readCount = bufferedReader.readLine();
visitCount = Integer.parseInt(readCount);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(bufferedReader!=null){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//객체 소멸 직전 실행(visitCount 값을 파일로 write)
public void destroy(){
FileWriter fileWriter = null;
PrintWriter printWriter = null;
File file = null;
try {
fileWriter = new FileWriter(counterFile);
printWriter = new PrintWriter(fileWriter,true);
printWriter.println(visitCount);
} catch (IOException e) {
e.printStackTrace();
} finally{
printWriter.close();
}
}
//service() -> doGet() : 클라이언트 요청이 들어올때 마다 호출
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>카운터</title></head>");
out.println("<body>");
visitCount++;//카운터의 값을 1증가
out.println("당신은 "+visitCount+" 번째 방문자 입니다.");
out.println("</body></html>");
}
}
*/
package servlet.lifecycle;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CounterServlet extends HttpServlet{
//변수 저장하는 방법(변수, 파일, DB 세가지 방법이 있다.)
private int visitCount;
//카운트 한 값을 저장 시킬 공간
//private String counterFile = "F:\\apache-tomcat-6.0.35\\counter.dat";
private String counterFile;
//생성자( 객체 생성)
public CounterServlet(){
}
//객체 생성 직후 실행(count값 read 한 다음에 visitCount로 넣기)
public void init(){
System.out.println("counterFile : "+counterFile);
ServletConfig conf = getServletConfig();
counterFile = conf.getInitParameter("saveFile");
System.out.println("counterFile : "+counterFile);
DataInputStream dataInputStream = null;
try {
dataInputStream = new DataInputStream(new FileInputStream(counterFile));
visitCount = dataInputStream.readInt();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(dataInputStream!=null){
try {
dataInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//객체 소멸 직전 실행(visitCount 값을 파일로 write)
public void destroy(){
DataOutputStream dataOutputStream = null;
try {
dataOutputStream = new DataOutputStream(new FileOutputStream(counterFile));
dataOutputStream.writeInt(visitCount);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if( dataOutputStream!=null){
try {
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//service() -> doGet() : 클라이언트 요청이 들어올때 마다 호출
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><head><title>카운터</title></head>");
out.println("<body>");
visitCount++;//카운터의 값을 1증가
try{
Thread.sleep(5000);
}catch(Exception e){
}
out.println("당신은 "+visitCount+" 번째 방문자 입니다.");
out.println("</body></html>");
}
}
- 실행결과
'프로그래밍 > JSP Programming' 카테고리의 다른 글
2012-4-26 cookie 실습 (0) | 2012.04.26 |
---|---|
2012-4-26 session 관리 (0) | 2012.04.26 |
2012-4-26 Multi-thread 상황에서 Data 동기화 (0) | 2012.04.26 |
2012-4-26 Process와 Thread단위 프로그램 띄우기 (정의) (0) | 2012.04.26 |
회원목록을 클릭했을 때 모든 조회목록 출력하기 (request scope의 requestDispatch 사용하기)[실습] (0) | 2012.04.26 |