Rumah  >  Artikel  >  Bagaimana untuk membuat benang kacang tunggal selamat dan mempunyai prestasi yang lebih baik di java?

Bagaimana untuk membuat benang kacang tunggal selamat dan mempunyai prestasi yang lebih baik di java?

王林
王林ke hadapan
2024-02-09 09:00:201019semak imbas

Dalam pembangunan Java, corak tunggal ialah corak reka bentuk yang biasa digunakan untuk memastikan kelas hanya mempunyai satu objek contoh. Walau bagaimanapun, dalam persekitaran berbilang benang, menggunakan corak tunggal boleh menyebabkan isu keselamatan benang, sekali gus menjejaskan prestasi dan ketepatan program. Jadi, bagaimana untuk membuat benang kacang tunggal selamat dan mempunyai prestasi yang lebih baik di Jawa? Editor PHP Yuzai akan memperkenalkan dan menjawab aspek berikut untuk anda.

Kandungan soalan

Saya cuba menguji kod di bawah dengan berbilang pengguna. Tetapi memandangkan kelas adalah singleton yang diuruskan oleh spring, hanya terdapat satu objek yang dicipta dan berbilang benang cuba mengakses objek yang sama.

Disebabkan rentetan keluaran yang tidak konsisten. Cuba selesaikan masalah ini dengan menggunakan kata kunci yang disegerakkan dalam kaedah applogger. Ia berfungsi seperti yang diharapkan. Tetapi kita perlu berkompromi dengan prestasi.

Bagaimana untuk mengendalikan kacang tunggal dalam persekitaran berbilang benang dan memperoleh prestasi yang lebih baik melalui pengubahsuaian pembolehubah contoh (pembina rentetan)?

Editkod dan tambah kaedah aggregatelogger. Kaedah ini akan mengagregatkan rentetan kepada pembina rentetan sedia ada yang telah diisytiharkan di peringkat kelas, supaya pembina rentetan akan mempunyai log agregat daripada kaedah applogger dan aggregatelogger.

@Aspect
    @Slf4j
    @Component
    public class A{
     private StringBuilder builder = new StringBuilder();
     public StringBuilder getSb(){
     return builder;
     }
     public void appendToSb(String s){
     builder.append(s);
     }

    @Around("@annotation(execTimeLogger)")
    public Object appLogger(ProceedingJointPoint pjp){
     long startTime = xxx;
     Object object = pjp.proceed();
     long endTime = xxx;
     String str = "Hello";
     appendToSb(str);
    return object;
    }

    @Around("@annotation(logger)")
    public Object aggregateLogger(ProceedingJointPoint pjp){
     long startTime = xxx;
     Object object = pjp.proceed();
     long endTime = xxx;
     String str = "World";
     appendToSb(str);
     log.info(getSb().toString()); // o/p will be Aggregated Log 
     getSb().setLength(0);
    return object;
    }
    
}

Penyelesaian

Reka bentuk awak salah, maafkan saya kerana terlalu tumpul. Walaupun dalam satu transaksi perniagaan yang anda ingin log, mungkin terdapat berbilang lapisan aplikasi yang melaksanakan berbilang operasi dalam berbilang rangkaian. Mengapa semua ini perlu ada dalam satu mesej log? Biasanya anda log semua mesej menggunakan beberapa jenis pelanggan dan/atau ID transaksi atau apa sahaja yang mengenal pasti entiti logik yang anda ingin jejak dan log dengan betul. Kebanyakan rangka kerja pengelogan menggunakan sejenis Konteks Diagnostik Berpeta (MDC)itu. Sama ada anda log masuk ke konsol atau pangkalan data atau pengagregat log seperti Logstash atau Graylog, anda boleh mencari, menapis dan mengagregat mengikut entiti atau transaksi yang anda minati untuk mencari semua mesej log yang sepadan. Tidak perlu memasukkan semuanya ke dalam satu mesej log.

Sudah tentu, daripada mencemarkan kod teras anda dengan pernyataan log, anda boleh memanfaatkan aspek untuk pembalakan. Memecahkan kebimbangan silang seperti pembalakan adalah salah satu kelebihan utama AOP. Tetapi anda harus melakukannya dengan betul. Jadi aspek tunggal anda sama ada menggunakan MDC atau melakukan simpan kira sendiri dalam beberapa jenis pemetaan. Saya syorkan menggunakan alatan yang telah disediakan oleh rangka kerja pengelogan anda dan membiarkan aspek memfokuskan pada perkara yang terbaik, iaitu memintas titik sambung yang betul.

Memandangkan prestasi juga merupakan salah satu kebimbangan anda, anda mungkin mahu mengkonfigurasi rangka kerja pengelogan anda untuk pengelogan tak segerak untuk menjadikan aplikasi anda lebih pantas dan lebih responsif. Log masuk ke fail juga secara amnya lebih pantas daripada log masuk ke konsol. Mungkin repositori GitHub ini dengan readme yang menarik dan penanda aras JMH memberikan anda maklumat menarik sebagai tambahan kepada apa yang kita bincangkan di sini. Jika anda bercakap bahasa Jerman, beberapa hari yang lalu di blog Heise.de ini. Kandungan Jerman artikel ini pada asasnya sama dengan readme bahasa Inggeris, saya hanya ingin memberikan sumber saya.

Apapun, apabila menggunakan pengelogan tak segerak, ID pengagregatan log menjadi lebih penting dalam konteks berbilang benang.

Atas ialah kandungan terperinci Bagaimana untuk membuat benang kacang tunggal selamat dan mempunyai prestasi yang lebih baik di java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam