concurrency bug patterns for multicore systems
http://www.ibm.com/developerworks/java/library/j-concurrencybugpatterns/index.html?ca=drs-


1. An antipattern from Jetty

volatile 변수를 쓸 데 없는 곳에 사용하지 마라, Optimization에 관련된 필드 선언이기 때문에 잘 모르면 쓰지 말고, java.util.concurrent 패키지의 AtomicXX 클래스를 사용해라 .


2. Synchronization on mutable fields

변하지 않는 객체로만 동기화 객체로 써라, 객체의 인스턴스가 여러 개로 나누어지면 동기화를 보장할 수 있다. 동기화는 인스턴스 단위이다.


3. java.util.concurrent lock leak
java.util.concurrent.Lock 사용시에는 finally로 반드시 lock을 처리한다.
Lock의 생성과 해지를 늘 기억해라. 이런 게 귀찮다고 생각하지 말자. c/c++은 끔직했다...


4. Performance tuning synchronized blocks
동기화 블럭은 최소단위로 써라


5. Multi-stage access
상황에 잘 맞게 써야 하는데, 무조건 이렇게 바꾸라는 것은 아니다.
thread-safe한 메소드를 잘 구현하고 싶을 때, 클래스안의 변수는 동기화 타입(ConcurrentHashMap)이긴 하지만, return 또는 선언하는 곳에서 문제가 될 수 있다. 
무조건 동기화 변수만 쓴다고 해서 모든 곳에서 다 동기화가 이루어진다고 생각하지 말자.


6. Symmetric lock deadlock
중첩으로 동기코드를 작성시에는 순서를 잘 고려하면서 사용해야 한다.


기술지원하다보면, 사람들은 가끔씩 3, 5번 정도가 조금 걸리는 것 같다.
요즘에 framework가 thread-safe한 인스턴스 기반이라서 framework 기반이 아닐 때만 이슈인듯.. 지금은 framework을 쓰다보니.. 문제는 생기지는 않지만, frameowork없이 개발을 못한다는 한계가 있다.

Posted by 김용환 '김용환'

댓글을 달아 주세요

loop 관련 코드를 최적화하면서 for, while 문에 문제가 있다고 알려진 버그들.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7070134
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044738
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7068051



open jdk7에서는 관련 코드(loop predicate)를 삭제를 했음
http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/c96c3eb1efae
 
해결을 위해서는 아래 옵션을 jvm에 추가해야 함.

 -XX:-UseLoopPredicate
Posted by 김용환 '김용환'
TAG Java, jdk7, 버그

댓글을 달아 주세요


6번째.. 마지막이다.
(오늘 jdk7 정식 릴리즈 되는날 완료했다. )

invokedynamic
fork/join
project coin
nio2
를 제외한 나머지 내용.


Jdk(java) 7 - 6 기타기능

Posted by 김용환 '김용환'
TAG Java, java7, jdk, jdk7

댓글을 달아 주세요


Jdk(java) 7 - 5. invoke-dynamic
.
Posted by 김용환 '김용환'

댓글을 달아 주세요




Jdk 7 4-forkjoin
.
Posted by 김용환 '김용환'

댓글을 달아 주세요



javap.exe 또는 이클립트 플러그인을 이용하는 방법이 있다. 나는 그냥 javap를 활용한다.

그냥 javap.exe 파일 을 쓰지 않고...

E:\jdk1.7\test\bin>"c:\Program Files\Java\jdk1.7.0\bin\javap.exe" HelloWorld.class
Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
  public static void main(java.lang.String[]);
}



"javap.exe -c 클래스이름" 이란 명령어를 내린다.

E:\jdk1.7\test\bin>"c:\Program Files\Java\jdk1.7.0\bin\javap.exe" -c HelloWorld.class
Compiled from "HelloWorld.java"
public class HelloWorld {
  public HelloWorld();
    Code:
       0: aload_0
       1: invokespecial #8                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: ldc           #16                 // String Hello World
       2: astore_1
       3: getstatic     #18                 // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: invokevirtual #24                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      10: return
}





Posted by 김용환 '김용환'

댓글을 달아 주세요


https://www.youtube.com/watch?v=hcY8cYfAEwU




Effective java 의 저자로 유명한 Josh Bloch의 발표동영상이다.

발로 적은 내용을 공유한다. 

성공할 수 없었던 자바의 특징을 먼저 설명하였다. (장점은 아래 PPT 참조) 특별히, 다른 언어에서 사용하는 일부 기능 생략도 성공 중의 하나였다.(lexical macros, multiple implementation inheritance, operator overloading, 헤더 파일, 다큐먼트).  

이 분이 얘기한 자바의 단점 또는 추한 부분을 얘기했다.
1. int->float, long->double형으로 형을 변환(conversion)하면서 생기는 문제(widening)
2. compound 할당 연산자가 작은 타입으로 변환하는 casting 문제 (narrowing)
3. equals를 구현(override)하였지만, ==, != 연산자는 주소를 가지고 비교한다. 
4. constant 변수가 inline된다. 
5. 
불필요한 비안정성을 이끌었던 디폴트 생성자는 처음부터 없어야 한다
6. 생성자에서 override된 메소드를 호출하는 것이 가능(legal)하면 안된다. 미묘한 버그를 생산할 수 있다.
7. unsigned 타입의 부재
8. 단일화된 Exception 상속개념이 없다.
9. switch 문이 잘 구조화되지 않았다.
10. Arrays의 toString을 잘 구현해야 내용물이 출력한다. 자바를 처음 배우는 친구들이 매번 실수한다.
11. Exception이 막 발생한 (pending) exception을 제거하고 새로운 것으로 만들 수 있다.
12. Cloneable 인터페이스에 clone 이라는 함수가 없다. 




발표자료가 웹에 없어서 캡쳐해서 공유한다. 





















[##_http://knight76.tistory.com/script/powerEditor/pages/1C%7Ccfile2.uf@17624E3F4E2F9ED21BFBDA.png%7Cwidth=%22600%22%20height=%22202%22%20alt=%22%22%20filename=%22java-10.png%22%20filemime=%22image/jpeg%22%7C_##]





Posted by 김용환 '김용환'

댓글을 달아 주세요




최근에 내 블로그에서 소개한 Twitter가 JVM으로 간다는 소식을 작성하였는데, 관련해서 OSCON 2011 에서 관련 내용이 발표되었다. 


O'Reilly OSCON Java 2011, Raffi Krikorian, "Twitter: From Ruby on Rails to the JVM" 

동영상 :   http://goo.gl/Klj9v

발로 쓴 내용 : 처음에는 배경설명을 많이 한다.  IO가 어마하게 많았다. 프로젝트이름을 Gosai Kiji(꿩?)으로 결정했다. 서버 부하를 잘 처리하고, 여러 언어(특별히 Scala, java)에 대한 유연성이 있어야 했다. 

GC, runtime gc, deploy 이슈를 해결하기 위해서 많은 조사를 했다. 그리고, Finagle이라는 것을 만들었다.
http://twitter.github.com/finagle/
 
Scala, 자바 뿐 아니라 다른 JVM 언어에서 비동기 RPC 클라이언트/서버 모듈을 만들어지주는 라이브러리를 개발했다. 예쁜 코드이다. 

jvm 기반에 동작하는 많은 어플들을 개발하고 운영하고 있다. 

그렇다고 해서 java(jvm)을 사용하는 것이 트위터가 ruby를 썼다는 것을 실수였다는 것을 의미하는 것은 아니다. java는 많은 리소스를 가질 수 있다. 엄청난 트래픽에 대한 유연성을 가지고 있어서 쓴 것이다.

평 : 지난 번에 쓴 내용에서  크게 벗어나지 않았던 것 같다. 트위터의 발전을 기원하며~^^

 자료 : PPT가 없어서 유투브에서 발표 자료 캡쳐함
























 







Posted by 김용환 '김용환'

댓글을 달아 주세요



OSCON 2011 에서 Joe Darcy가 발표한 2개를 공유한다.
 

JDK7 nutshell 

http://blogs.oracle.com/darcy/resource/OSCON/oscon2011_JDK7_nutshell.pdf

동영상 : https://www.youtube.com/watch?v=7nkB3hxH5po&feature=player_embedded

내용 : jdk 7 기본 소개, project coin에 시간을 많이 들임 (Netbeans 사용)




OpenJDK의 State 공유

http://blogs.oracle.com/darcy/resource/OSCON/oscon2011_OpenJDKState.pdf

내용 : JDK7으로 가는 여정, JCP의 state, jdk 7 기본 소개,jdk 8 방향

Posted by 김용환 '김용환'

댓글을 달아 주세요


java7 nio2를 소개.



Jdk 7 3-nio2
Posted by 김용환 '김용환'
TAG Java, java7, jdk7, NIO2

댓글을 달아 주세요