Bir üretim web uygulamasında, program arkadaşlarım her yerde StringBuffer kullandılar. Şimdi uygulama geliştirme ve düzeltmelerle ilgileniyorum. StringBuilder ve StringBuffer'ı okuduktan sonra , veri çekirdeklerimizde iş parçacığı güvenliğine ihtiyaç duymadığımız için tüm StringBuffer kodunu StringBuilder ile değiştirmeye karar verdim.
Örneğin: (Her veri çekirdeğinde StringBuffer'ın kullanımını görebilirim)
@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);
}
Her oturum / istek için ayrı bir veri çekirdekleri oluştururuz. Bir oturum tek bir kullanıcı tarafından kullanılır ve başka hiçbir kullanıcı oturum açamaz.
Göç etmeden önce başka noktaları düşünmeli miyim?
Tek bir iş parçacığı varsa (bekleyen iş parçacığı yok / yeni iş parçacığı nesne kilidi aramayacaksa), StringBuffer veya StringBuilder ile eşit olarak çalışır. StringBuffer durumunda, nesne kilidi almak için zaman alır ama nesne kilidi tutma / serbest bırakma dışında herhangi bir performans farkı olup olmadığını bilmek istiyorum.
StringBuffer
. Ben hiç böyle kod görmedim ama neredeyse çok iş parçacığı bakış açısından kötü bir tasarım eminim. Ben StringBuffer
arayüzü boyunca iplik senkronize kötü bir fikir olduğunu düşünüyorum çünkü bu sınıf olmamalı ve her zaman kullanmak gerektiğini düşünüyorum StringBuilder
. Diğerlerinin de belirttiği gibi, StringBuffer
tarihsel nedenlerden dolayı var.
sb
olduğu gibi yerel bir değişken olarak kullanırsanız , iplik güvenliği hiç de önemli değildir. Yönteme aynı anda bin iş parçacığı girse bile, her birinin kendi yerel değişkenleri ile kendi çağrı yığını olacaktır. StringBuilders asla birbirlerini etkilemez.