Trong một ứng dụng web sản xuất, các lập trình viên đồng nghiệp của tôi đã sử dụng StringBuffer ở mọi nơi. Bây giờ tôi đang chăm sóc phát triển ứng dụng và sửa chữa. Sau khi đọc StringBuilder và StringBuffer, tôi đã quyết định thay thế tất cả mã StringBuffer bằng StringBuilder vì chúng tôi không cần sự an toàn của luồng trong các bean dữ liệu của chúng tôi.
Ví dụ: (Trong mỗi bean dữ liệu tôi có thể thấy việc sử dụng StringBuffer)
@Override
public String toString() {
StringBuffer sb = new StringBuffer();// replace it from StringBuilder
sb.append(" ABCD : ").append(abcd);
sb.append(", EFGH : ").append(efgh);
sb.append(", IJKL : ").append(ijkl);
}
Chúng tôi tạo một bean dữ liệu riêng cho mỗi phiên / yêu cầu. Một phiên được sử dụng bởi một người dùng mà không người dùng nào khác có thể truy cập.
Tôi có nên xem xét các điểm khác trước khi di chuyển?
Nếu có một luồng đơn (không có luồng chờ / không có luồng mới nào sẽ tìm khóa đối tượng), thì nó sẽ hoạt động như nhau với StringBuffer hoặc StringBuilder. Tôi biết trong trường hợp của StringBuffer, cần có thời gian để khóa đối tượng nhưng tôi muốn biết liệu có bất kỳ sự khác biệt nào về hiệu năng giữa chúng ngoại trừ việc giữ / nhả khóa đối tượng hay không.
StringBuffer
. Tôi chưa bao giờ thấy mã như vậy nhưng tôi gần như chắc chắn đó là một thiết kế tồi từ góc độ đa luồng. Vì tôi nghĩ rằng việc đồng bộ hóa luồng dọc theo StringBuffer
giao diện là một ý tưởng tồi, tôi nghĩ rằng lớp này không nên tồn tại và người ta phải luôn luôn sử dụng StringBuilder
. Như những người khác đã đề cập, StringBuffer
tồn tại vì lý do lịch sử.
sb
như một biến cục bộ như trong ví dụ của bạn, thì an toàn luồng không thành vấn đề. Ngay cả khi một ngàn luồng đồng thời nhập vào phương thức, mỗi luồng sẽ có ngăn xếp cuộc gọi riêng với các biến cục bộ của riêng nó. StringBuilders sẽ không bao giờ can thiệp lẫn nhau.