Tổng hợp 121 câu hỏi phỏng vấn Java kèm đáp án chi tiết, song ngữ Việt–Anh — sắp xếp từ cơ bản đến nâng cao. Ôn luyện miễn phí, tự động lưu tiến độ.
Java là ngôn ngữ hướng đối tượng, strongly-typed, biên dịch ra bytecode và chạy trên JVM. Cùng một file .class có thể chạy trên nhiều hệ điều hành mà không cần biên dịch lại — đó là "Write Once, Run Anywhere" từ 1995, nay do…
== kiểm tra identity còn .equals() kiểm tra equality theo logic của class. Với primitive như int hay boolean, == so sánh giá trị thực. Với object, == so sánh reference — hai biến có trỏ tới cùng một instance trên heap hay không —…
Không. Java có primitive types (int, long, double, boolean, char...) sống song song với objects. Primitive không có method, không gán null được, và không kế thừa từ Object. Ngôn ngữ thuần OOP như Smalltalk coi mọi thứ là object — kể cả số 5…
Stack là vùng nhớ mỗi thread có riêng, lưu biến local và tham chiếu, tự giải phóng khi method kết thúc theo LIFO. Heap là vùng nhớ dùng chung cho toàn JVM, lưu object thật và được Garbage Collector dọn. Hãy hình dung stack như…
Java là ngôn ngữ lập trình hướng đối tượng, biên dịch ra bytecode chạy trên JVM, nổi bật với tính độc lập nền tảng, an toàn bộ nhớ, và hỗ trợ đa luồng mạnh. Hãy nghĩ Java như một bộ phim được quay thành phim…
String immutable = sau khi tạo xong, nội dung không thể thay đổi; mọi thao tác như concat(), replace() đều trả về một object mới thay vì sửa tại chỗ. Lý do thiết kế: - String pool cần nó: JVM duy trì vùng cache (String…
String là chuỗi bất biến (immutable) trong Java, còn StringBuilder và StringBuffer là hai lớp chuỗi mutable dùng khi bạn cần nối hoặc chỉnh sửa chuỗi nhiều lần. String sau khi tạo thì nội dung không đổi; mọi thao tác như + hay concat() đều…
Constructor overloading là việc một class có nhiều constructor cùng tên với class nhưng khác danh sách tham số (kiểu, số lượng, hoặc thứ tự). Khi gọi new, compiler chọn constructor khớp với argument truyền vào. Cơ chế hoạt động giống method overloading: Java dùng…
Access modifier là từ khoá kiểm soát phạm vi truy cập của class, field, method, hoặc nested class trong Java. Có bốn mức, từ hẹp nhất đến rộng nhất: private, default (không ghi gì), protected, public. Bảng dưới tóm tắt mức truy cập: Modifier Cùng…
Hai khái niệm dễ nhầm — cùng chữ "over" nhưng giải quyết bài toán khác hẳn. Overloading Overriding --------- Scope Cùng class Subclass override method của parent Signature Khác tham số Trùng signature với parent Resolution Compile-time Runtime (dynamic dispatch) Polymorphism Static Dynamic (subtype) Quy…
Encapsulation — Inheritance — Polymorphism — Abstraction. - Encapsulation (Đóng gói): gom dữ liệu + method thao tác vào cùng class; kiểm soát truy cập qua private/protected, chỉ lộ ra method nghiệp vụ. Ví dụ repo pattern: phần còn lại của hệ thống gọi user.getName()…
Static member thuộc về class, không phải instance. Hình dung: private int balance là số dư riêng từng tài khoản; static int totalAccounts là một biến duy nhất dùng chung cho mọi Account. Khi nên dùng: - Utility/helper: Math.abs(), Collections.sort(). - Hằng số: static final…
NPE xảy ra khi gọi method/truy cập field/unbox primitive trên reference null. Tony Hoare gọi null là "lỗi tỷ đô" của mình. Phòng tránh, theo độ ưu tiên: 1. Thiết kế không nhận/trả null: dùng Optional<T, list rỗng List.of(), hoặc throw exception. Cách bền nhất.…
- this = "chính tôi" — reference đến object hiện tại. - super = "phiên bản parent" — truy cập member cha đã bị override/che. this dùng cho: phân biệt field/param trùng tên, gọi constructor khác cùng class this(...), truyền chính object (register(this)), method chaining…
Ba ngữ cảnh, cùng ý "không thể đổi" — nhưng "đổi" gì thì phụ thuộc: - final class — chống extends (vd String, Integer). Bảo vệ invariant + cho JIT inline mạnh hơn. - final method — chống override. Cho template method khung không cho…
Abstract class Interface --------- Kế thừa extends 1 cái implements nhiều Constructor Có Không State (instance field) Có Không — (chỉ hằng số) Default method (concrete) Có Có — (Java 8+) Ngữ nghĩa "is-a" "can-do" (capability) Khi nào chọn cái nào: - Abstract class: class…
Collections Framework là kiến trúc thống nhất trong Java để lưu trữ và thao tác trên nhóm đối tượng, cung cấp các interface, implementation và utility dùng chung. Nó xuất hiện từ JDK 1.2 và là nền tảng cho hầu hết thao tác dữ liệu…
ArrayList là mảng động, LinkedList là danh sách liên kết đôi (doubly-linked list). Khác biệt cốt lõi nằm ở cấu trúc dữ liệu bên trong: ArrayList lưu phần tử liên tục trong một mảng, còn LinkedList lưu mỗi phần tử trong một node riêng có…
HashSet TreeSet --------- Cấu trúc Hash table Red-black tree add/contains O(1) trung bình O(log n) Thứ tự duyệt Không xác định Sắp xếp Null 1 element null Không — (NPE) Yêu cầu hashCode() + equals() đúng Comparable hoặc Comparator API extra — first, last, subSet,…
HashMap TreeMap --------- Cấu trúc Hash table (Java 8+: bucket nhiều entry → red-black tree) Red-black tree get/put O(1) trung bình O(log n) Thứ tự key Không xác định Sắp xếp Null key 1 cái Không Extra API — firstKey, floorKey, subMap, tailMap Khi dùng:…
Khác mục đích, nhưng bên dưới thực chất là cùng một thứ. HashSet<E HashMap<K,V --------- Implements Set Map Lưu trữ Phần tử duy nhất Cặp key → value Method add, contains, remove put, get, remove Thực ra: HashSet chỉ là wrapper của HashMap — value…
Iterator<E là interface duyệt collection mà không cần biết cấu trúc bên trong (mảng, linked list, tree...). Lý do quan trọng nhất — xoá an toàn: đoạn sau throw ConcurrentModificationException: Phải dùng iterator.remove() hoặc list.removeIf(String::isEmpty). Lưu ý: - Enhanced for-loop thực ra là syntactic sugar…
Ba mức xử lý "collection bị sửa trong khi đang duyệt": Fail-fast Fail-safe (snapshot) Weakly-consistent ------------ Ví dụ ArrayList, HashMap CopyOnWriteArrayList ConcurrentHashMap Behavior Throw ConcurrentModificationException Duyệt bản sao, không throw, không thấy thay đổi mới Không throw, có thể thấy hoặc không thấy thay đổi…
Comparable<T Comparator<T --------- Đặt ở Bên trong class T Bên ngoài, class riêng/lambda Method int compareTo(T o) int compare(T a, T b) Số cách sắp xếp Một (natural ordering) Nhiều strategy Return value: âm = this đứng trước, 0 = bằng, dương = đứng sau.…
Queue<E là collection FIFO (First-In-First-Out) — "xếp hàng". API có 2 phiên bản: Thao tác Throw exception Return special value --------- Insert add(e) offer(e) → false nếu full Remove remove() → NSEE poll() → null nếu rỗng Peek element() → NSEE peek() → null nếu…
Cả 2 thread-safe, nhưng cách hoàn toàn khác. Hashtable (legacy) ConcurrentHashMap (Java 5+) --------- Lock synchronized toàn method — 1 thread tại 1 thời điểm Bucket-level + CAS (lock-free read) Throughput multi-thread Thấp (contention cao) Cao hơn nhiều lần Iterator Fail-fast → CME Weakly-consistent —…
4 dạng theo lý thuyết — thực tế chỉ 3 vì Java không cho multiple class inheritance. Vì sao cấm multiple class inheritance? Diamond problem — nếu D extends B, C mà cả 2 đều có method m(), không rõ gọi version nào. C++ cho…
LSP (chữ "L" trong SOLID, Barbara Liskov 1987): subtype phải thay thế được supertype mà không phá hành vi chương trình. Code chạy với Animal phải chạy đúng khi đưa Dog vào — không bug bất ngờ. Ví dụ kinh điển vi phạm — Square…
Polymorphism ("nhiều hình thức") — cùng interface có nhiều hành vi khác nhau. Java có 2 loại: 1. Compile-time — Method overloading: cùng tên, khác signature → compiler chọn lúc biên dịch. 2. Runtime — Method overriding: subclass có version riêng → JVM dispatch theo…
Abstract class không tạo instance trực tiếp được — chỉ làm template cho subclass. Subclass phải implement các abstract method. Đặc điểm: có constructor, có state (instance field), trộn abstract + concrete method, dùng đủ access modifier. Chỉ 1 parent. Khi nào chọn abstract class…
Interface định nghĩa contract — danh sách method mà implementation phải cung cấp. Tách "làm được gì" khỏi "làm thế nào". Một class implements nhiều interface. Lịch sử tiến hoá: Phiên bản Thêm gì ------ Java ≤ 7 Chỉ public abstract method + public static…
SOLID là 5 nguyên tắc thiết kế OOP (Robert C. Martin): S Single Responsibility, O Open/Closed, L Liskov Substitution, I Interface Segregation, D Dependency Inversion. S — Single Responsibility: Một class chỉ có một lý do để thay đổi. Không phải "1 class = 1…
Singleton giới hạn class chỉ có đúng 1 instance trong app, cung cấp điểm truy cập toàn cục. Dùng cho: logger, config, DB connection pool, cache. Các cách implement, từ đơn giản đến tốt nhất: 1. Eager — đơn giản, thread-safe nhờ JVM. Nhược: tạo…
Factory tách "tạo object" khỏi "dùng object". Caller không gọi new ConcreteClass() mà gọi factory; factory quyết định trả về concrete nào. Vì sao cần: thay implementation, ẩn complexity, cache/pool, dễ test (mock factory). 3 biến thể chính: 1. Simple Factory: 2. Factory Method (GoF):…
Inheritance ("is-a") Composition ("has-a") --------- Cơ chế class B extends A class B { A a; } Coupling Chặt — biết internal parent Lỏng — chỉ phụ thuộc interface Đổi runtime Không Có (đổi member) Nguyên tắc Effective Java: Favor composition over inheritance. Ví dụ…
Method hiding xảy ra khi subclass khai báo static method trùng signature parent → không override mà che giấu. JVM dispatch theo kiểu reference (compile-time). Hiding Overriding --------- Áp dụng static method Instance method Dispatch Theo reference type Theo object type (vtable) @Override Không Có…
Thread là đơn vị thực thi cho phép chạy code song song. Mỗi Java app đã có main thread; tạo thêm thread để task không block main. 4 cách tạo, từ cũ → hiện đại: 1. Extend Thread (hiếm dùng — chiếm slot extends). 2.…
Synchronization đảm bảo chỉ một thread vào critical section tại một thời điểm — ngăn race condition khi nhiều thread share state. Keyword synchronized dùng intrinsic lock của object: Vì sao phải sync count++? Compile thành 3 bytecode op (read → add → write). 2…
Deadlock xảy ra khi nhiều thread chờ lock của nhau theo vòng tròn — tất cả block vĩnh viễn. App không crash, không exception, chỉ "đứng hình". 4 điều kiện Coffman (phải đủ cả 4): mutual exclusion, hold-and-wait, no preemption, circular wait. Phá circular wait…
ExecutorService (Java 5+) quản lý thread pool — bạn submit Runnable/Callable, executor lo phần còn lại. new Thread() thủ công burst 10K request → 10K OS thread → OOM. Không reuse, không backpressure. Factory trong Executors: Factory Khi dùng ------ newFixedThreadPool(n) CPU-bound newCachedThreadPool() Task ngắn,…
volatile đảm bảo visibility giữa các thread — mọi read/write đi thẳng main memory, không qua CPU cache. Đây là keyword nhẹ nhất trong concurrency toolbox. Không có volatile, JVM/CPU có thể cache biến → thread A đổi nhưng thread B vẫn thấy giá trị…
Future (Java 5) đại diện cho kết quả async. Hạn chế: get() block, không chain được, exception handling khó. CompletableFuture (Java 8+) khắc phục: non-blocking, chain được, xử lý exception sạch. Operator phổ biến: thenApply (map), thenCompose (flatMap), thenAccept (consumer), thenCombine (zip 2 CF), handle…
Race condition xảy ra khi nhiều thread truy cập shared data đồng thời, kết quả cuối phụ thuộc vào thứ tự thực thi → không thể đoán trước. Phòng tránh, theo thứ tự ưu tiên: 1. Atomic variables: AtomicInteger.incrementAndGet() — lock-free, CAS. 2. synchronized /…
- JVM (Java Virtual Machine): thực thi bytecode, platform-specific (mỗi OS có JVM riêng), cung cấp runtime + GC + JIT. - JRE (Java Runtime Environment): JVM + thư viện chuẩn. Chạy được app Java đã biên dịch, không biên dịch được. - JDK (Java…
GC tự động thu hồi bộ nhớ từ object không còn được tham chiếu — Java dev không cần free() thủ công. 3 bước cốt lõi: 1. Marking — duyệt object graph từ GC roots (stack frame, static field, JNI ref), đánh dấu object reachable.…
Heap chia thành 2 region dựa trên tuổi object: Lý do (weak generational hypothesis): hầu hết object chết trẻ — tạo rồi mất ngay (vd biến local trong method). Quá trình: 1. Object tạo mới vào Eden. 2. Minor GC chạy thường xuyên ở Young…
OutOfMemoryError (OOM) xảy ra khi JVM không cấp phát được bộ nhớ — heap đầy, GC không giải phóng đủ. Các loại OOM thường gặp: - Java heap space — heap đầy. Phổ biến nhất. - GC overhead limit exceeded — GC chạy 98% thời…
Memory leak Java: object vẫn còn reference nhưng không còn cần — GC không thể collect (vì nguyên tắc GC: chỉ thu hồi object unreachable). Nguyên nhân phổ biến: - Unclosed resource: file handle, DB connection, network socket. - Listener không unregister: subject giữ reference…
Stack overflow Heap overflow --------- Vùng nhớ Stack (per-thread, ~512KB-1MB) Heap (shared, GB) Nguyên nhân Đệ quy quá sâu, method call lồng Quá nhiều object/memory leak Exception StackOverflowError OutOfMemoryError: Java heap space Phát hiện Nhanh, rõ (stack trace dài) Chậm, GC chạy hoài rồi mới…
ClassLoader tải file .class vào memory lúc runtime. 3 loại built-in (theo hierarchy): 1. Bootstrap ClassLoader — JVM built-in (C++), tải core class trong java.lang, java.util (rt.jar / Java 9+ module). 2. Platform ClassLoader (Java 9+, trước là Extension) — tải các module platform không…
Virtual Threads (Project Loom, Java 21 GA) là thread nhẹ do JVM quản lý — chạy hàng triệu thread trên chỉ vài OS thread. Vấn đề trước Java 21: Platform Thread = 1:1 với OS thread, ~1MB stack. Server muốn xử lý 10K request đồng…
Record (Java 16+ — JEP 395) là class đặc biệt cho dữ liệu bất biến. Một dòng thay 50 dòng POJO. Compiler tự sinh: constructor canonical, accessor name() / age() (không có "get"), equals / hashCode / toString, field ngầm private final. Tuỳ biến qua…
Sealed class (Java 17+) hạn chế những class nào được phép extend nó, khai báo qua permits. Mỗi subclass phải là final, sealed hoặc non-sealed. Lợi ích lớn nhất là khi ghép với Pattern Matching: compiler biết đủ mọi subtype nên kiểm tra được exhaustiveness…
Text block (Java 15 — JEP 378) là chuỗi nhiều dòng bọc trong """, viết JSON/SQL/HTML mà không phải nối + và escape \n thủ công. Kết quả vẫn là String thông thường, không phải kiểu mới. Compiler tự cắt indent chung của cả khối…
Pattern matching for switch (Java 21 — JEP 441) cho switch test theo kiểu, vừa bind biến đã ép kiểu, vừa cho thêm when lọc — gom được chuỗi if-instanceof dài. Kết hợp với sealed: compiler bắt buộc xử lý mọi subtype, bỏ sót là…
Contract Java quy định: 1. Nếu a.equals(b) == true → a.hashCode() == b.hashCode() bắt buộc. 2. Ngược lại không bắt buộc — hai object khác nhau có thể có cùng hashCode (hash collision). Vì sao phải override cả hai: HashMap/HashSet tìm bucket bằng hashCode() trước,…
Comparable Comparator --------- Package java.lang java.util Method compareTo(T o) compare(T o1, T o2) Implement ở đâu Bên trong class Class riêng / lambda Thứ tự Natural ordering (1 cách) Custom ordering (nhiều cách) Sửa class gốc Bắt buộc Không cần Khi nào dùng cái nào:…
Ba từ khoá không liên quan nhau dù tên giống — câu này kiểm tra độ nắm chắc khái niệm cơ bản. - final — modifier: biến không gán lại được, method không override được, class không kế thừa được (chi tiết xem câu keyword…
wait() sleep() --------- Thuộc Object (instance method) Thread (static method) Monitor lock Nhả lock khi chờ Giữ nguyên lock Đánh thức notify()/notifyAll() hoặc timeout Hết thời gian Điều kiện gọi Phải trong synchronized (không thì IllegalMonitorStateException) Gọi ở đâu cũng được Dùng cho Phối hợp…
Java luôn luôn pass-by-value — không có pass-by-reference. Điểm gây nhầm: với object, thứ được copy là giá trị của reference (địa chỉ trỏ đến object), không phải bản thân object. Hệ quả: - Method sửa được trạng thái object của caller (vì 2 reference…
Cấu trúc lõi: mảng bucket; entry được đặt vào bucket theo hash(key) & (n - 1) (n = capacity, luôn là luỹ thừa của 2). put(key, value): 1. Tính hash từ hashCode() của key (JDK trộn thêm bit cao để giảm collision). 2. Định vị…
String pool (string constant pool) là vùng cache trong heap chứa các String literal — các literal giống nhau dùng chung 1 object. - String a = "hello" → JVM tìm trong pool: có rồi thì trả reference cũ → "hello" == "hello" cho true…
Immutable class = object không đổi trạng thái sau khi tạo. Quy tắc viết: 1. Class khai báo final — chặn subclass override method làm lộ/đổi state. 2. Mọi field private final. 3. Không có setter — state chỉ gán 1 lần qua constructor. 4.…
Shallow copy Deep copy --------- Copy gì Object ngoài cùng; field object bên trong dùng chung reference Đệ quy copy toàn bộ object graph Hệ quả Sửa object con → cả 2 bản cùng thấy 2 bản độc lập hoàn toàn Chi phí Rẻ Đắt…
JIT (Just-In-Time) compiler biên dịch bytecode → mã máy native ngay lúc chạy, thay vì thông dịch từng lệnh. JVM khởi động ở chế độ interpreter (chạy ngay, không cần warm-up) và song song đếm số lần mỗi method/vòng lặp chạy. Khi vượt ngưỡng ("hot"),…
Wrapper class là bản "đóng gói object" của primitive: int→Integer, double→Double, boolean→Boolean... Cần chúng vì Collections/Generics chỉ nhận object (List<Integer, không có List<int). - Autoboxing: compiler tự chèn Integer.valueOf(x) khi gán primitive vào chỗ cần object. - Unboxing: tự chèn i.intValue() ở chiều ngược lại.…
Cả hai dịch bit sang phải; khác ở bit điền vào bên trái: - (signed / arithmetic): điền bằng bit dấu → số âm vẫn âm. - (unsigned / logical): luôn điền 0 → kết quả không bao giờ âm. Với số dương, hai toán…
Covariant return = khi override một method, class con được phép trả về kiểu con (subtype) của kiểu mà method cha khai báo, thay vì đúng y kiểu đó. Có từ Java 5. Trước Java 5 phải trả đúng Animal, buộc caller ép kiểu (Cat).…
transient đánh dấu một field không tham gia serialization. Khi object được ObjectOutputStream ghi ra byte, field transient bị bỏ qua; lúc deserialize nó nhận giá trị mặc định (0, false, null). Dùng khi field: (1) nhạy cảm (password, token) không nên nằm trong file/luồng;…
Marker interface là interface rỗng (không method) — chỉ dùng để gắn nhãn một class, báo cho JVM/thư viện rằng class đó có một tính chất nào đó. Ví dụ chuẩn: Serializable, Cloneable, RandomAccess. Cơ chế: code khác kiểm tra bằng instanceof. ObjectOutputStream gặp object…
Đặt constructor private để cấm bên ngoài new trực tiếp, giành lại quyền kiểm soát cách tạo object. Các trường hợp dùng: - Utility class toàn static (như Math, Collections): private constructor để không ai lỡ new. - Singleton: chỉ một instance, lấy qua getInstance().…
ArrayList bọc một mảng Object[]. Khi add mà mảng đã đầy, nó cấp mảng mới lớn hơn rồi copy toàn bộ phần tử sang. - Khởi tạo mặc định là rỗng; lần add đầu tiên cấp dung lượng 10. - Khi đầy, dung lượng mới…
Vì autoboxing không gọi new Integer(...) mà gọi Integer.valueOf(int), và method này trả về object lấy từ cache với các giá trị nhỏ. - JLS 5.1.7 bắt buộc cache cho boolean, byte, char trong \u0000–\u007f, và short/int trong -128..127. Trong dải này, hai lần boxing…
Gặp ConcurrentModificationException. Iterator của các collection trong java.util là fail-fast: nó nhớ modCount lúc tạo và so lại ở mỗi lần next(); gọi list.remove(...) trực tiếp làm modCount lệch → ném exception ngay. Ba cách xoá đúng: Lưu ý thêm: xoá phần tử áp chót…
Arrays.asList() trả về một view kích thước cố định (java.util.Arrays$ArrayList, không phải java.util.ArrayList) bọc quanh mảng gốc. Nó không có chỗ để chứa thêm phần tử nên add/remove/clear ném UnsupportedOperationException. So với List.of() (Java 9+): - Arrays.asList(): cố định kích thước nhưng set() được, cho…
double/float theo chuẩn IEEE 754 nhị phân. Số 0.1 và 0.2 là phân số tuần hoàn trong hệ nhị phân nên chỉ được lưu xấp xỉ; cộng lại ra 0.30000000000000004. Với tiền, dùng một trong hai cách: 1. BigDecimal khởi tạo bằng chuỗi, không bằng…
Trước Java 8, mọi entry trùng bucket nằm trên một danh sách liên kết → tra cứu xấu nhất là O(n). Từ Java 8, HashMap chuyển bucket thành cây đỏ-đen (red-black tree) khi bucket quá dài: - TREEIFYTHRESHOLD = 8: bucket có từ 8 node…
Entry sẽ không tìm lại được dù vẫn nằm trong map. HashMap tính bucket một lần lúc put; nếu sau đó bạn đổi field tham gia hashCode(), giá trị hash mới trỏ sang bucket khác nên get() tìm nhầm chỗ. Hệ quả: - get, containsKey,…
Dùng LinkedHashMap với access-order rồi override removeEldestEntry. Cơ chế: - Constructor 3 tham số với accessOrder = true khiến mỗi lần get/put đẩy entry được truy cập về cuối danh sách liên kết nội bộ. Entry ở đầu là entry lâu chưa dùng nhất. -…
1. Trùng key ném IllegalStateException. Bản 2 tham số không có cách xử lý va chạm nên nó ném luôn: Sửa bằng tham số thứ ba — merge function — quyết định giữ giá trị nào: 2. Value null ném NullPointerException. toMap dùng map.merge(...) bên…
Không dùng lại được. Mỗi stream chỉ đi qua một thao tác terminal; gọi lần hai ném IllegalStateException: stream has already been operated upon or closed. Không thấy chạy là vì stream lười (lazy): filter, map, peek, sorted chỉ mô tả pipeline. Không có thao…
try-with-resources (Java 7) tự gọi close() cho mọi resource khai báo trong ngoặc, theo thứ tự ngược với thứ tự khai báo, kể cả khi có exception. Điểm khác quan trọng nằm ở tình huống cả khối try lẫn close() cùng ném exception: Suppressed exception…
String bất biến nên mỗi phép + tạo ra một chuỗi mới và copy toàn bộ nội dung cũ. Trong vòng lặp n lần, tổng khối lượng copy là O(n²). Compiler dịch thành gì: - Trước Java 9: javac tự đổi a + b +…
Enum Thread.State định nghĩa 6 trạng thái: - NEW — đã new Thread(...) nhưng chưa gọi start(). - RUNNABLE — đang chạy hoặc đang chờ CPU cấp slot. JVM gộp hai tình huống này làm một, không có trạng thái "RUNNING" riêng. - BLOCKED —…
Khác ở giá trị trả về và cách lỗi được truyền đi. Runnable.run() Callable.call() --------- Trả về void V (generic) Checked exception không ném được throws Exception Nộp cho pool execute() hoặc submit() chỉ submit() Kết quả không có Future<V Điểm dễ vấp trong thực…
JVM chỉ chờ user thread. Khi user thread cuối cùng kết thúc, JVM thoát và giết ngay mọi daemon thread đang chạy dở. Hệ quả quan trọng: daemon bị dừng đột ngột, finally và shutdown logic có thể không chạy. Vì vậy không dùng daemon…
Object đủ điều kiện thu hồi khi không còn đường đi tới nó từ GC root nào. GC root gồm: biến local trên stack của thread đang sống, static field, tham chiếu từ JNI, và chính các thread đang chạy. Đây là reachability, không phải…
Cả hai đều đảm bảo loại trừ lẫn nhau và đều reentrant. Khác ở mức độ điều khiển. synchronized ReentrantLock --------- Nhả lock tự động khi ra khỏi khối phải unlock() trong finally Thử lấy lock không tryLock(), tryLock(timeout) Chờ có thể huỷ không lockInterruptibly()…
Khác ở object nào đang giữ monitor. - Method instance synchronized → khoá trên this. Mỗi instance một lock riêng. - Method static synchronized → khoá trên đối tượng Counter.class. Một lock duy nhất cho toàn bộ class, dùng chung giữa mọi instance. Hệ quả…
Java không có cách dừng cưỡng bức an toàn. Cơ chế chính thức là hợp tác (cooperative): gửi tín hiệu, thread tự thoát ở điểm nó chọn. Thread.stop() bị deprecate từ lâu và nay ném UnsupportedOperationException vì nó nhả toàn bộ monitor mà thread đang…
Xuất phát từ tỉ lệ thời gian chờ trên thời gian tính toán của task, công thức tham chiếu của Brian Goetz: - Ncpu = Runtime.getRuntime().availableProcessors() - Ucpu = mức sử dụng CPU mục tiêu (0..1) - W/C = thời gian chờ / thời gian…
Tham số chính: corePoolSize, maximumPoolSize, keepAliveTime, workQueue, threadFactory, RejectedExecutionHandler. Thứ tự xử lý một task mới hay bị hiểu sai: 1. Đang chạy < corePoolSize → tạo thread mới. 2. Đủ core rồi → đẩy vào workQueue. 3. Queue đầy → mới tạo thêm thread…
Ba toán tử ghép khác nhau ở kiểu (signature) của hàm truyền vào: - thenApply(Function<T, U) — biến đổi kết quả đồng bộ. Giống map. - thenCompose(Function<T, CompletionStage<U) — hàm trả về một future khác, kết quả được làm phẳng. Giống flatMap. Dùng thenApply ở…
Metaspace là vùng chứa metadata của class (cấu trúc class, method, constant pool đã phân giải), thay cho PermGen từ Java 8 (JEP 122). PermGen (≤ Java 7) Metaspace (Java 8+) --------- Vị trí nằm trong heap native memory, ngoài heap Kích thước cố định…