Một ví dụ về ReadWriteLock

Việc viết ứng dụng Java đa luồng là không đơn giản. Cần hết sức quan tâm bởi vì viết đồng bộ hóa không tốt có thể làm cho ứng dụng của các bạn rời rạc. Bộ JVM được dùng chung bởi mọi luồng. Nếu nhiều luồng cần sử dụng cùng đối tượng hay những biến tĩnh, sự truy nhập tới dữ liệu dùng cùng một luồng phải được quản lý cẩn thận. Từ phiên bản 1.5, những lớp tiện ích trong lập trình đồng bộ đã được thêm vô trong bộ JSDK.

Trong từ khóa synchronized được dùng để nhận một khóa riêng trên một đối tượng. Khi một luồng nhận một khóa trên một đối tượng để đọc hay viết, những luồng khác phải đợi cho đến khi khóa trên đối tượng đó thả ra. Với cách suy nghĩ có thể có nhiều luồng đọc một dữ liệu dùng chung và chỉ có một luồng viết được cập nhật dữ liệu trên nó. Không cần thiết khóa khi đọc dữ liệu dùng chung bởi vì nhiều thao tác đọc có thể thực hiện song song trừ khi có một thao tác viết.

Bài viết này là một ví dụ dùng interface ReadWriteLock được giới thiệu trong bộ Java 1.5 API. Và trong đó có đoạn viết:

A ReadWriteLock maintains a pair of associated locks, one for read-only operations and one for writing. The read lock may be held simultaneously by multiple reader threads, so long as there are no writers. The write lock is exclusive.


Writer.java Để cập nhật dữ liệu. Writer dùng WriteLock của ReadWriteLock để khoá truy cập đến dictionary.



01 package deneme.readwritelock;
02
03
04 public class Writer extends Thread{
05 private boolean runForestRun = true;
06 private Dictionary dictionary = null;
07
08 public Writer(Dictionary d, String threadName) {
09 this.dictionary = d;
10 this.setName(threadName);
11 }
12 @Override
13 public void run() {
14 while (this.runForestRun) {
15 String [] keys = dictionary.getKeys();
16 for (String key : keys) {
17 String newValue = getNewValueFromDatastore(key);
18 //updating dictionary with WRITE LOCK
19 dictionary.set(key, newValue);
20 }
21
22 //update every seconds
23 try {
24 Thread.sleep(1000);
25 } catch (InterruptedException e) {
26 e.printStackTrace();
27 }
28 }
29 }
30 public void stopWriter(){
31 this.runForestRun = false;
32 this.interrupt();
33 }
34 public String getNewValueFromDatastore(String key){
35 //This part is not implemented. Out of scope of this artile
36 return "newValue";
37 }
38 }


Reader.java Đọc dữ liệu.


01 package deneme.readwritelock;
02
03 public class Reader extends Thread{
04
05 private Dictionary dictionary = null;
06 public Reader(Dictionary d, String threadName) {
07 this.dictionary = d;
08 this.setName(threadName);
09 }
10
11 private boolean runForestRun = true;
12 @Override
13 public void run() {
14 while (runForestRun) {
15 String [] keys = dictionary.getKeys();
16 for (String key : keys) {
17 //reading from dictionary with READ LOCK
18 String value = dictionary.get(key);
19
20 //make what ever you want with the value.
21 System.out.println(key + " : " + value);
22 }
23
24 //update every seconds
25 try {
26 Thread.sleep(1000);
27 } catch (InterruptedException e) {
28 e.printStackTrace();
29 }
30 }
31 }
32
33 public void stopReader(){
34 this.runForestRun = false;
35 this.interrupt();
36 }
37 }


Dictionary.java Quản lý truy cập đến dictionary. Đọc được quản lý bởi ReadLock và viết (cập nhật) được quản lý bởi WriteLock.


01 package deneme.readwritelock;
02
03 import java.util.HashMap;
04 import java.util.concurrent.locks.Lock;
05 import java.util.concurrent.locks.ReentrantReadWriteLock;
06
07 public class Dictionary {
08
09 private final ReentrantReadWriteLock readWriteLock =
10 new ReentrantReadWriteLock();
11
12 private final Lock read = readWriteLock.readLock();
13
14 private final Lock write = readWriteLock.writeLock();
15
16 private HashMap dictionary = new HashMap();
17
18 public void set(String key, String value) {
19 write.lock();
20 try {
21 dictionary.put(key, value);
22 } finally {
23 write.unlock();
24 }
25 }
26
27 public String get(String key) {
28 read.lock();
29 try{
30 return dictionary.get(key);
31 } finally {
32 read.unlock();
33 }
34 }
35
36 public String[] getKeys(){
37 read.lock();
38 try{
39 String keys[] = new String[dictionary.size()];
40 return dictionary.keySet().toArray(keys);
41 } finally {
42 read.unlock();
43 }
44 }
45
46 public static void main(String[] args) {
47 Dictionary dictionary = new Dictionary();
48 dictionary.set("java", "object oriented");
49 dictionary.set("linux", "rulez");
50 Writer writer = new Writer(dictionary, "Mr. Writer");
51 Reader reader1 = new Reader(dictionary ,"Mrs Reader 1");
52 Reader reader2 = new Reader(dictionary ,"Mrs Reader 2");
53 Reader reader3 = new Reader(dictionary ,"Mrs Reader 3");
54 Reader reader4 = new Reader(dictionary ,"Mrs Reader 4");
55 Reader reader5 = new Reader(dictionary ,"Mrs Reader 5");
56 writer.start();
57 reader1.start();
58 reader2.start();
59 reader3.start();
60 reader4.start();
61 reader5.start();
62 }
63
64 }

Theo(ilkinbalkanay)


Đọc tiếp >>

Cao Trong Hien

Macworld 2008 - MacBook air

    I - Vì sao một thêm SSD 64G với giá $1300

  1. Solid State Drives là gì?

Solid state là thuật ngữ ngành điện chỉ các mạch điện được xây dựng ngoài các thiết bị bán dẫn। bắt đầu dùng để định nghĩa những thiết bị như Radio dùng chất bán dẫn hay nói đúng hơn là trong môi trường chân không। Phần lớn những thiết bị điện chúng ta đang dùng được xây dựng trên các thiết bị bán dẫn và các con chips

Một SSD nhìn từ phía ngoài thì không khác so với các ổ cứng thông thường। Nó được thiết kế để đặt vào một chiếc notebook hay desktop vào vị trí của ổ cứng. Để làm được thì nó cần có một chuẩn về kích cỡ như 1.8, 2.5 hay 3.5-inch. Nó cũng phải dùng giao tiếp ATA hay SATA.

  1. Vì sao dùng Solid State Drive?

Solid state drives có vài lợi điểm so với một ổ từ:

  • Ít hao điện

  • Truy cậo nhanh

  • An toàn cao

Nó được sản xuất chủ yếu cho máy tính sách tay. Vì nó truy xuất dữ liệu không cần mắt đọc, vì vậy ít hao điện.

Demo gần đây của 2 chiếc notebook, Fujitsu đã chứng minh với tốc độ tăng hơn 20% khi boot Windows XP trên SSD.

An toàn là yếu tố cần thiết đối với các ổ di động. Một ổ đĩa cứng rất dễ hỏng khi gặp một chấn động. Từ khi SSD lưu dữ liệu trên chips, bỏ đi thành phần chạy sẽ giảm nguy hiểm đối với ổ cứng di động.

  1. Tại sao SSD không ưa chuộng trên PC?



Như phần lớn các công nghệ khác, vấn đề chính của sự hạn chế này là giá cả. Giá của một chiếc ổ cứng này có thể ngang với giá trị của chiếc notebook. Nó sẽ cải thiện dần khi các công ty sản xuất và các nhà cung ứng Chips cải thiện vấn đề thu nhập. Drives loan tin rằng tại 2007 CES giá sẽ giảm một nữa cùng dung lượng so với năm trước.

Một vấn đề khác của SSD là dung lượng. Ổ cứng bây giờ có thể chứa hơn 200GB trong ổ cứng của một notebook 2.5-inch. Phần lớn những ổ SSD trong 2007 CES có dung lượng là 64GB. Vậy chẳng những nó đắt tiền hơn mà còn hạn chế lưu trữ.

II - Một số thông tin về MacBook air

• Mỏng từ .16 đến .75-inch
• Màn hình 12.8 x 8.94 inches (1 inche = 2,56 cm)
• Nặng 3 pounds(1 pount = 450 gam)
• Pin 5 – với tất cả các ứng dụng được mở.

• Intel Core 2 Duo Processor 1.6 or 1.8GHz
• Bus 800MHz.
• 2GB RAM 667MHz, chuẩnn DDR2.

• 13.3-inch.
• Phân giải 1,280 x 800 pixels
• Giao tiếp Micro-DVI (có thể dùng DVI, VGA, cổng tích hợp và S-Video output)
• Card màn hình Intel GMA X3100 Graphics processor with 144MB RAM shared

• Ổ cứng 1.8-inch 80GB HD hay 64GB Solid State Drive (ổ cứng dùng công nghệ Flash, nhưng phải trả thêm $1,300)
• Multitouch trackpad with gestures. Pans, zooms, rotates,...
• Wifi 802.11n và Bluetooth 2.1.
• Bạn có thể lựa chọn một external HD với giá $99, giao tiếp USB.
• Một cổng USB 2.0, một cổng audio, một Micro-DVI


Đọc tiếp >>

Cao Trong Hien

CES 2008 – Những gian hàng ấn tượng

1. Intel, gian hàng biểu diễn theo cấu trúc hình soắn ốc.

2. Con tàu cướp biển Disney, gian hàng của Blu-ray. Xây dựng dựa trên bộ film Cướp biển Caribbean, một sáng kiến của Disney World.




3. LG với rất nhiều TVs



4. Belkin, khá mờ nhạt




5. Philips mang tính thẩm mỹ cao.


6. Eneloop, với nhiều pin cỡ lớn.



7. Gã khổng lồ Samsung chiếm ưu thế.



8. Sharp, một thác TVs, rất đẹp.


9. Sony, nơi để thư giản.




10. Gibson có một bữa tiệc lớn, một sân khấu biểu diễn hàng đêm cho khác tham quan. Trên hình là Peter Frampton.





Hình ảnh của gizmodo.com

Đọc tiếp >>

Cao Trong Hien

Những quyển sách được chờ đợi trong năm 2008

Sau đây là những quyển sách sắp phát hành từ những nhà xuất bản InformIT, Pearson và Pragmatic Bookhelf được chờ đợi trong năm 2008.

1. SOA Design Patterns - tác giả: Thomas Erl
Xem chi tiết : http://safari.informit.com/9780136135166

2. Core Servlets and JavaServer Pages, Volume 2: Advanced Technologies, 2nd Edition
Xem chi tiết trên : http://www.informit.com/store/product.aspx?isbn=0131482602&rl=1

Nếu bạn là một Ruby & Rails developers có một số sách mới dành cho bạn do nhà xuất bản Pearson ấn hành:

3. The Rails Way - tác giả: Obie Fernandez
Xem chi tiết : http://www.informit.com/title/0321445619

4. Design Patterns in Ruby – tác giả: Russ Olsen
Xem chi tiết : http://www.informit.com/title/0321490452

6. RailsSpace: Ruby on Rails Tutorial(dvd tutorial product)
Xem chi tiết : http://www.informit.com/title/0321517067

Dành cho những người phát triển GWT :

7. Google Web Toolkit Applications – tác giả: Ryan Dewsbury
Xem chi tiết : http://www.informit.com/title/0321501969

8. Google Web Toolkit Solutions – tác giả: David Geary
Xem chi tiết : http://www.informit.com/title/0132344815

Sắp ra đời từ nhà sách Pragmatic Bookshelf:

9. Prototype and script.aculo.us – tác giả: Christophe Porteneuve
Xem chi tiết: http://pragprog.com/titles/cppsu

10. Rails for PHP Developers -tác giả: Derek DeVries
Nếu bạn là một PHP dev muốn tìm hiểu Rails thì không thể không xem qua. Xem chi tiết: http://pragprog.com/titles/ndphpr


Đọc tiếp >>

Cao Trong Hien

Hãy là một good web developer


Bạn là một nhà phát triển web (Web Developer), và bạn muốn có một công việc tốt hơn. 5 điều sau đây đều có thể có thể giúp bạn nhiều khi nói chuyện với nhà tuyển dụng - và dĩ nhiên không cần nhiều kinh nghiệm đâu.

5. Biết và nhận xét về các dịch vụ web
Bạn dùng Flickr để chi sẽ hình ảnh, có một account Facebook và dùng thường xuyên. Và bạn có một chút tham vọng. Không cần viết code nhiều, bạn đã có sẵn một ý tưởng tốt hơn các dịch vụ đã có — nó sẽ như thế nào, một lý do đơn giản mà bạn cho rằng người ta sẽ dùng nó, và kết hợp tất cả.

4. Viết một blog
Chắc rồi, có hàng triệu blog, nhưng không phải mọi người đều có. Và hành động chăm sóc nó sẽ giúp bạn trở nên một người của công chúng — cũng là một cách cho chúng tôi thấy bạn đang làm gì.

3. Có ý tưởng lớn
Bạn không thể dùng quá nhiều thời gian để tìm kiếm trong các blog công nghệ mà không chia sẻ cho mọi người. Sự ra đời của web 2.0 là một sự kiện lớn — mỗi người có một ý tưởng, một kiến thức nhất định, sau đó là thử nghiệm, và tiếp theo là vận may khi áp dụng nó.
Đừng suốt ngày nghĩ về nó, mà hãy hiện thực nó — và hãy nói rằng "Tôi đã viết cho mình một dịch vụ chu sẽ file, và là một dự án cá nhân". Đương nhiên, nếu bạn tìm cách đề cập đến ý tưởng lớn của bạn, và bạn luôn muốn hiện thực nó.

2. Tinh thần học hỏi
Tôi nghĩ rằng IT là một lĩnh vực chỉ phù hợp cho những người ham học hỏi và luôn tìm tòi những điều mới — vì nó luôn thay đổi. Một lập trình viên tốt là một người ham học hỏi, đọc các blog và luôn nắm bắt xu hướng công nghệ.

1. Luôn muốn vươn lên(Better)!

Và đương nhiên, một điều đơn giản bạn có thể làm, không cần kinh nghiệm, là quan tâm bạn làm gì và làm như thế nào. Một lập trình viên tệ thường nói (bad programmer) "Tôi đã gặp vấn đề này, và tôi biết cách hoàn thiện nó". Một người phát triển tốt (good developer) là một người luôn tìm kiếm những cách tốt nhất để giải quyết vấn đề, phụ thuộc vào những gì họ có và kinh nghiệm. Thật khó mà giải thích những điều này, nhưng nếu bạn có thể nói "Tôi tự học dùng Photoshop" hay "Tôi đã viết một ứng dụng nhỏ dùng AJAX" — hay chỉ cần bạn nói một cách say sưa về những điều bạn muốn làm... Chắc chắn họ sẽ để ý đến bạn.

Theo(joshsharp)

Nếu bạn có một ý kiến khác, có thể cho ý kiến đó lên comments.

Đọc tiếp >>

Cao Trong Hien

Chào năm 2008


Trước hết, tôi xin gởi lời cảm ơn CHÂN THÀNH đế tất cả mọi người đã bỏ thời gian xem và nhận xét cho các bài viết trên blog này.

Năm qua là một năm thử nghiệp viết blog. 32 bài viết và 10 comments có lẽ là một con số khá khiêm tốn. Có một số lời khen và góp ý, nhưng tập tành viết lách cũng làm mình có những nhận thức về xu hướng thế giới. Số bài viết thuộc kiểu tutorial khá ít (10 bài), trong khi mục đích chính tôi lập ra blog này là vấn đề tutorial, có lẽ cần phải tăng trong năm 2008.




Có một số bài được các bạn khá quan tâm (theo thống kê của Feedburnder):

  1. Frameworks nào sẽ thay thế Struts

  2. Dùng Dojo và JSON xây dựng Ajax application

  3. Ubuntu 7.10

  4. Netbeans: Xắp xếp và phân trang

  5. 3 cách tích hợp Spring và Struts


Còn theo bản thân tôi thì:

  1. Dùng Dojo và JSON xây dựng Ajax application

  2. Tại sao Facebook không được xây dựng bằng java

  3. Frameworks nào sẽ thay thế Struts

  4. 3 cách tích hợp Struts và Spring(Đây là bài đầu tiên và theo đúng mục đích mà tôi viết blog)

  5. Web Office: 2007 một năm nhìn lại


Và cuối cùng, tôi xin gởi lời chúc SỨC KHOẺ VÀ THÀNH CÔNG đến tất cả các bạn và gia đình.


Đọc tiếp >>

Cao Trong Hien