Thật là một thời gian khá lâu cho bài học về Java phần tiếp theo này. Đây có thể được xem là bài viết Java khởi đầu cho năm mới, tuy nhiên lại là một chủ đề “còn nợ” lại từ năm cũ. Có thể vì thời gian đợi khá lâu sẽ làm bạn quên đôi chút. Mình xin nhắc lại là chúng ta đang nói về các cách thức Đồng bộ hóa thread trong lập trình Java. Chúng ta tìm cách làm sao để các Thread tuy được “tự do tự tại” trong việc thực thi các tác vụ song song, lại có thể biết tuân thủ theo các nguyên tắc trật tự nào đó khi chúng có sử dụng chung đến các đối tượng, hay chúng ta gọi là các tài nguyên. Bài hôm trước là một cách, hôm nay chúng ta đến với cách thứ hai.
Java Bài 45: Đồng Bộ Hóa Tập 2 – Đồng Bộ Mutual Exclusive & Từ Khóa synchronized
Như vậy là sau khi kết thúc bài học mở màn về Đồng bộ hóa hôm trước, mình có nói rằng sẽ có hai cách thức để đồng bộ các Thread với nhau. Các cách đồng bộ này đều mang đến một mục tiêu chung là giới hạn các Thread truy cập vào cùng một tài nguyên dùng chung. Và bài học hôm nay mình sẽ trình bày cụ thể cách thức đầu tiên trong hai cách trên đây, cách thức này có cái tên Loại trừ lẫn nhau (Mutual Exclusive). Sau các bài học về đồng bộ này, bạn sẽ biết cách làm thế nào để tránh sự xung đột về tài nguyên hệ thống khi làm việc với Multithread, và cả biết xem khi nào thì nên dùng cách thức đồng bộ nào nữa đấy.
Java Bài 44: Đồng Bộ Hoá Tập 1 – Làm Quen Với Đồng Bộ Hoá
Với việc kết thúc Bài 43 vừa rồi thì chúng ta đã sơ bộ làm quen với Thread rồi. Nếu bạn nào còn muốn tìm hiểu nhiều hơn về các phương thức khác của Thread thì có thể xem thêm ở bài viết mở rộng của mình.
Hôm nay chúng ta sẽ sang kiến thức mới mẻ hơn, cũng liên quan đến Thread, nhưng nói về cái sự Đồng bộ hoá các Thread. Trong quá trình tiếp cận khái niệm về Đồng bộ hoá, bạn sẽ hiểu rõ hơn các phương thức hữu dụng bên trong một Thread mà mình đã đề cập ở bài học trước hay bài viết mở rộng. Mời các bạn cùng đến với bài học.
Java Bài 43: Thread Tập 3 – Vòng Đời Của Thread
Với việc làm quen với Thread ở bài hôm trước, bạn đã biết rằng có hai cách để chúng ta tạo ra một Thread rồi.
Bước sang phần này của Thread, chúng ta cùng tìm hiểu sâu hơn về Thread, để xem khi bạn tạo ra một Thread nào đó, thì vòng đời của nó sẽ như thế nào? Thread đó sẽ trải qua những trạng thái nào trong vòng đời đó? Dựa vào các trạng thái đó, làm sao để các Thread có thể đồng bộ hoá, hay có thể hiểu là tự điều chỉnh độ ưu tiên trong việc thực thi tác vụ giữa các Thread trong cùng một Process với nhau? Mời bạn cùng đến với những kiến thức thú vị này hôm nay.
Java Bài 42: Thread Tập 2 – Các Cách Thức Để Tạo Một Thread
Sau khi tập 1 về Thread ra lò, mình nhận được nhiều chia sẻ và phản hồi từ các bạn. Mình cảm nhận được mối quan tâm rất lớn của các bạn với kiến thức này. Điều này thật sự thú vị. Thực ra mình cũng từng rất thích thú khi tiếp cận với Thread. Tuy chỉ là một kiến thức nhỏ nhoi trong biển kiến thức Java, nhưng Thread như mang đến một làn gió mới, một khả năng mới để chúng ta xây dựng các ứng dụng đa nhiệm, mạnh mẽ, thiết thực hơn, tận dụng tối đa hiệu năng của hệ thống hơn. Và đặc biệt hơn nữa, sau khi biết đến Thread là gì, thì chúng ta đã có thể bắt tay vào tìm hiểu các kiến thức về xây dựng một game viết bằng Java được rồi đấy.
Vậy hôm nay, chúng ta sẽ tiếp tục củng cố cái sự quan tâm đối với Thread bằng cách đi cụ thể hơn về nó, chúng ta sẽ nói đến các cách thức để khai báo và khởi tạo một Thread.
Java Bài 41: Thread Tập 1 – Thread Và Các Khái Niệm
Thread hay Multithread đều có ý nghĩa như nhau trong kiến thức của bài học này. Thread dịch ra tiếng Việt là Luồng, và Multithread là Đa luồng. Luồng ở đây chính là Luồng xử lý của hệ thống. Và bởi vì lý do chính đáng để cho Thread ra đời cũng chính là để cho các ứng dụng có thể điều khiển nhiều Thread khác nhau một cách đồng thời, mà nhiều Thread đồng thời như vậy cũng có nghĩa là Đa Thread, hay Multithread. Chính vì vậy mà kiến thức Thread hay Multithread cũng chỉ là một.
Java Bài 40: Exception Tập 4 – Throw, Throws & Custom Exception
Bài hôm nay chúng đa đến với kiến thức còn lại của Exception. Bài học sẽ hướng dẫn bạn đạt đến một cảnh giới hoàn toàn không sợ sệt gì với Exception cả. Thậm chí bạn có thể “tung hứng” chúng, đẩy chúng về một nơi khác xử lý, và rồi bạn còn có thể tự tạo ra một Exception cho riêng bạn nữa.
Nếu bạn thấy thú vị thì mời các bạn cùng đến với bài viết.
Java Bài 39: Exception Tập 3 – Try Catch Và Hơn Thế Nữa
Thông qua hai bài viết về Exception, bạn đã phần nào yên tâm hơn cho “số phận” của các dòng code mà bạn tạo ra rồi đúng không nào. Sự thật là với việc sử dụng tốt try catch mà hai bài học trước mình đã nói rất kỹ, thì có thể nói ứng dụng của bạn sẽ trở nên rất mạnh mẽ, an toàn, và cũng khá thông minh khi có thể thông báo kịp thời các trường hợp lỗi cho user.
Tuy nhiên, nếu đã nói về Exception thì phải nói cho tới. Đừng lấp lửng nửa vời mà lỡ mất các chức năng đặc sắc mà công cụ này mang đến. Hôm nay chúng ta tiếp tục đào sâu về Exception khi nói về try catch với finally, try catch với resource, và các phương thức hữu ích của lớp Exception.
Java Bài 38: Exception Tập 2 – Bắt (Bẫy) Exception Thông Qua Try Catch
Ở bài hôm trước các bạn đã làm quen với khái niệm Exception, và thử tạo một vài Exception để cùng “xem chơi”. Tuy nhiên, cái chính mà Exception ra đời không phải để chúng ta chỉ đứng nhìn một cách “bất lực” như vậy đâu. Chúng ta hoàn toàn có thể đối mặt với Exception, bằng cách bắt lấy chúng, chặn chúng lại không để chương trình bị lỗi, và làm những gì chúng ta mong muốn, như bài trước mình có dùng từ “bẻ luồng”.
Như vậy, phần thứ hai của chuỗi bài về Exception hôm nay chúng ta nói đến các kỹ thuật để bắt các Exception này.
Java Bài 37: Exception Tập 1 – Làm Quen Với Exception
Trước khi bắt đầu đi chi tiết vào bài học, mình muốn các bạn biết rằng, ở đời không ai là hoàn hảo cả. Khi con người ta đủ lớn khôn, họ sẽ bắt đầu mắc lỗi. Điều quan trọng trong cuộc sống này là, không phải lúc nào bạn cũng cứ tránh xảy ra lỗi (vì nói thẳng ra là chẳng ai muốn dây vào lỗi hết), mà là nên học cách như thế nào đó để khi mắc lỗi rồi thì sẽ khắc phục và vượt qua lỗi lầm như thế nào thôi.
Ôi sao bài học hôm nay nặng triết lý quá vậy. Thực ra mình dẫn dụ tí cho vui. Đại ý của bài học hôm nay cũng sẽ gần như triết lý trên vậy. Tức là chúng ta sẽ xem xét đến một khía cạnh LỖI. LỖI ở đây là LỖI xảy ra trong các đoạn code mà chúng ta viết ra, một cách nghiêm túc và chuyên sâu.
Quay lại triết lý một chút, rằng một khi mà ứng dụng của chúng ta đủ lớn (cả về số dòng code lẫn tính năng), thì chắc chắn khi đó chúng ta sẽ khó kiểm soát được tính ổn định của logic ứng dụng. Và đến một lúc nào đó sẽ có LỖI xảy ra, LỖI nhẹ sẽ khiến hệ thống tung ra một số thông báo lạ lẫm đến người dùng, làm họ hoang mang, lỗi nặng hơn nữa sẽ làm cho ứng dụng bị kết thúc một cách đột ngột. Và cũng như triết lý trên kia, bạn không mong muốn LỖI xảy ra, nhưng bạn nên hiểu và phân biệt được các dạng LỖI trong Java, để có thể cung cấp cho ứng dụng một kịch bản đủ mạnh để vượt qua được LỖI mà không bị kết thúc một cách đột ngột, chí ít là cũng có thể thông báo một nội dung rõ ràng về tình trạng LỖI, hơn là để họ loay hoay với cái chức năng mà ứng dụng của bạn đã mất khả năng kiểm soát.