Pertanyaan Apa artinya 'disinkronkan'?


Saya punya beberapa pertanyaan mengenai penggunaan dan signifikansi dari synchronized kata kunci.

  • Apa arti penting dari synchronized kata kunci?
  • Kapan metode harus synchronized?
  • Apa artinya secara program dan logis?

818
2017-07-06 06:47


asal


Jawaban:


Itu synchronized kata kunci adalah semua tentang membaca dan menulis thread yang berbeda untuk variabel, obyek, dan sumber daya yang sama. Ini bukan topik sepele di Jawa, tapi di sini adalah kutipan dari Sun:

synchronized metode memungkinkan yang sederhana   strategi untuk mencegah utas   gangguan dan konsistensi memori   kesalahan: jika suatu objek terlihat oleh   lebih dari satu utas, semua dibaca atau   menulis ke variabel objek tersebut   dilakukan melalui metode tersinkronisasi.

Singkatnya, sangat kecil: Saat Anda memiliki dua utas yang membaca dan menulis ke 'sumber' yang sama, katakan sebuah variabel bernama foo, Anda perlu memastikan bahwa utas ini mengakses variabel dengan cara atom. Tanpa synchronized kata kunci, utas 1 Anda mungkin tidak melihat perubahan utas 2 yang dibuat foo, atau lebih buruk lagi, itu mungkin hanya setengah berubah. Ini tidak akan menjadi apa yang Anda harapkan secara logis.

Sekali lagi, ini adalah topik non-sepele di Jawa. Untuk mempelajari lebih lanjut, jelajahi topik di SO dan Interwebs tentang:

Terus jelajahi topik ini sampai namanya "Brian Goetz" menjadi terkait permanen dengan istilah tersebut "konkurensi" di otak Anda.


749
2017-07-06 07:01



Yah, saya pikir kami sudah cukup banyak penjelasan teoritis, jadi pertimbangkan kode ini

public class SOP {
    public static void print(String s) {
        System.out.println(s+"\n");
    }
}

public class TestThread extends Thread {
    String name;
    TheDemo theDemo;
    public TestThread(String name,TheDemo theDemo) {
        this.theDemo = theDemo;
        this.name = name;
        start();
    }
    @Override
    public void run() {
        theDemo.test(name);
    }
}

public class TheDemo {
    public synchronized void test(String name) {
        for(int i=0;i<10;i++) {
            SOP.print(name + " :: "+i);
            try{
                Thread.sleep(500);
            } catch (Exception e) {
                SOP.print(e.getMessage());
            }
        }
    }
    public static void main(String[] args) {
        TheDemo theDemo = new TheDemo();
        new TestThread("THREAD 1",theDemo);
        new TestThread("THREAD 2",theDemo);
        new TestThread("THREAD 3",theDemo);
    }
}

catatan: synchronized memblokir panggilan thread berikutnya untuk menguji metode () selama eksekusi thread sebelumnya tidak selesai. Thread dapat mengakses metode ini satu per satu. Tanpa synchronized semua utas dapat mengakses metode ini secara bersamaan.

Ketika sebuah thread memanggil 'test' metode yang disinkronkan dari objek (objek di sini adalah turunan dari kelas 'TheDemo') ia memperoleh kunci dari objek itu, setiap thread baru tidak dapat memanggil metode sinkronisasi APAPUN dari objek yang sama selama ulir sebelumnya yang memperoleh kunci tidak melepaskan kunci.

Hal serupa terjadi ketika metode sinkronisasi kelas yang statis disebut. Thread mengakuisisi kunci yang terkait dengan kelas (dalam hal ini setiap metode sinkronisasi non-statis suatu instance dari kelas tersebut dapat dipanggil oleh sembarang thread karena kunci level objek tersebut masih tersedia). Setiap utas lainnya tidak akan dapat memanggil metode sinkronisasi kelas statis apa pun selama kunci tingkat kelas tidak dirilis oleh utas yang saat ini memegang kunci.

Output dengan disinkronisasi

THREAD 1 :: 0
THREAD 1 :: 1
THREAD 1 :: 2
THREAD 1 :: 3
THREAD 1 :: 4
THREAD 1 :: 5
THREAD 1 :: 6
THREAD 1 :: 7
THREAD 1 :: 8
THREAD 1 :: 9
THREAD 3 :: 0
THREAD 3 :: 1
THREAD 3 :: 2
THREAD 3 :: 3
THREAD 3 :: 4
THREAD 3 :: 5
THREAD 3 :: 6
THREAD 3 :: 7
THREAD 3 :: 8
THREAD 3 :: 9
THREAD 2 :: 0
THREAD 2 :: 1
THREAD 2 :: 2
THREAD 2 :: 3
THREAD 2 :: 4
THREAD 2 :: 5
THREAD 2 :: 6
THREAD 2 :: 7
THREAD 2 :: 8
THREAD 2 :: 9

Output tanpa disinkronkan

THREAD 1 :: 0
THREAD 2 :: 0
THREAD 3 :: 0
THREAD 1 :: 1
THREAD 2 :: 1
THREAD 3 :: 1
THREAD 1 :: 2
THREAD 2 :: 2
THREAD 3 :: 2
THREAD 1 :: 3
THREAD 2 :: 3
THREAD 3 :: 3
THREAD 1 :: 4
THREAD 2 :: 4
THREAD 3 :: 4
THREAD 1 :: 5
THREAD 2 :: 5
THREAD 3 :: 5
THREAD 1 :: 6
THREAD 2 :: 6
THREAD 3 :: 6
THREAD 1 :: 7
THREAD 2 :: 7
THREAD 3 :: 7
THREAD 1 :: 8
THREAD 2 :: 8
THREAD 3 :: 8
THREAD 1 :: 9
THREAD 2 :: 9
THREAD 3 :: 9

244
2018-05-15 13:23



Itu synchronized kata kunci mencegah akses bersamaan ke blok kode atau objek dengan beberapa Thread. Secara default, a Hashtable aku s synchronized, jadi hanya satu utas yang dapat mengakses tabel pada satu waktu.

Pada penggunaan non-synchronized konstruksi seperti HashMap, Anda harus membuat fitur keamanan thread dalam kode Anda untuk mencegah kesalahan konsistensi memori.


102
2018-01-22 18:39



synchronizedberarti bahwa dalam lingkungan multi-ulir, objek memiliki synchronized metode (s) / blok (s) tidak membiarkan dua utas untuk mengakses synchronized metode (s) / blok kode pada saat yang sama. Ini berarti bahwa satu utas tidak dapat membaca sementara utas lainnya memutakhirkannya.

Thread kedua akan menunggu sampai thread pertama menyelesaikan eksekusinya. Overhead adalah kecepatan, tetapi keunggulan dijamin konsistensi data.

Jika aplikasi Anda berulir tunggal, synchronized blok tidak memberikan manfaat.


73
2018-01-22 18:39



Itu synchronized kata kunci menyebabkan utas untuk mendapatkan kunci ketika memasukkan metode, sehingga hanya satu utas yang dapat menjalankan metode pada saat yang sama (untuk instance objek yang diberikan, kecuali jika itu adalah metode statis).

Ini sering disebut membuat kelas tidak aman, tetapi saya akan mengatakan ini adalah eufemisme. Meskipun benar bahwa sinkronisasi melindungi keadaan internal Vector agar tidak rusak, ini biasanya tidak banyak membantu pengguna Vector.

Pertimbangkan ini:

 if (vector.isEmpty()){
     vector.add(data);
 }

Meskipun metode yang terlibat disinkronkan, karena mereka sedang dikunci dan dibuka secara terpisah, dua untai yang waktunya terbatas dapat membuat vektor dengan dua elemen.

Jadi pada dasarnya, Anda harus melakukan sinkronisasi dalam kode aplikasi Anda juga.

Karena tingkat metode sinkronisasi adalah) mahal ketika Anda tidak membutuhkannya dan b) tidak cukup ketika Anda membutuhkan sinkronisasi, sekarang ada pengganti yang tidak disinkronkan (ArrayList dalam kasus Vector).

Baru-baru ini, paket konkurensi telah dirilis, dengan sejumlah utilitas pintar yang menangani masalah multi-threading.


50
2017-07-06 07:09



Ikhtisar

Kata kunci tersinkronisasi di Jawa ada hubungannya dengan keamanan-benang, yaitu ketika beberapa utas membaca atau menulis variabel yang sama.
Ini dapat terjadi secara langsung (dengan mengakses variabel yang sama) atau tidak langsung (dengan menggunakan kelas yang menggunakan kelas lain yang mengakses variabel yang sama).

Kata kunci tersinkronisasi digunakan untuk menentukan blok kode di mana beberapa utas dapat mengakses variabel yang sama dengan cara yang aman.

Lebih dalam

Sintaksis bijaksana synchronized kata kunci membutuhkan Object karena parameternya (disebut objek kunci), yang kemudian diikuti oleh { block of code }.

  • Ketika eksekusi bertemu kata kunci ini, thread saat ini mencoba untuk "mengunci / memperoleh / memiliki" (pilihlah) mengunci objek dan jalankan blok kode terkait setelah kunci telah diperoleh.

  • Setiap penulisan ke variabel di dalam blok kode yang disinkronkan dijamin akan terlihat oleh setiap utas lain yang sama menjalankan kode di dalam blok kode yang disinkronkan menggunakan yang sama mengunci objek.

  • Hanya satu utas yang dapat memegang kunci, selama waktu itu semua benang lain mencoba untuk mendapatkan yang sama mengunci objek akan menunggu (jeda eksekusinya). Kunci akan dilepaskan ketika eksekusi keluar dari blok kode yang disinkronkan.

Metode yang disinkronkan:

Menambah synchronized kata kunci untuk definisi metode sama dengan seluruh tubuh metode yang dibungkus dalam blok kode yang disinkronkan dengan mengunci objekmakhluk this  (misalnya metode) dan ClassInQuestion.getClass()  (untuk metode kelas).

- Metode Instance adalah metode yang tidak ada static kata kunci.
- Metode Kelas adalah metode yang memiliki static kata kunci.

Teknis

Tanpa sinkronisasi, tidak dijamin di mana urutan membaca dan menulis terjadi, mungkin meninggalkan variabel dengan sampah.
(Misalnya sebuah variabel dapat berakhir dengan separuh bit yang ditulis oleh satu utas dan setengah dari bit yang ditulis oleh utas lain, meninggalkan variabel dalam keadaan yang tidak ingin ditulis oleh kedua untaian, tetapi gabungan keduanya).

Ini tidak cukup untuk menyelesaikan operasi tulis di utas sebelumnya (waktu jam-jam) untaian lain membacanya, karena perangkat keras dapat menyimpan nilai variabel, dan untaian bacaan akan melihat nilai tembolok alih-alih apa yang ditulis ke saya t.

Kesimpulan

Jadi dalam kasus Java, Anda harus mengikuti Java Memory Model untuk memastikan bahwa kesalahan threading tidak terjadi.
Dengan kata lain: Gunakan sinkronisasi, operasi atom atau kelas yang menggunakannya untuk Anda di bawah tenda.

Sumber-sumber

http://docs.oracle.com/javase/specs/jls/se8/html/index.html
Spesifikasi Bahasa Java, 2015-02-13


20
2018-06-22 15:19



Anggap saja sebagai semacam pintu pagar seperti yang mungkin Anda temukan di lapangan sepakbola. Ada banyak orang yang ingin masuk tetapi di pintu putar mereka 'tersinkronisasi'. Hanya satu orang pada satu waktu yang bisa dilewati. Semua orang yang ingin melaluinya akan melakukannya, tetapi mereka mungkin harus menunggu sampai mereka bisa melewatinya.


18
2017-07-06 07:09



Apa kata kunci tersinkronisasi?

Benang berkomunikasi terutama dengan berbagi akses ke bidang dan referensi bidang referensi lihat. Bentuk komunikasi ini sangat efisien, tetapi membuat dua jenis kesalahan mungkin: gangguan benang dan kesalahan konsistensi memori. Alat yang diperlukan untuk mencegah kesalahan ini adalah sinkronisasi.

Blok atau metode yang disinkronkan mencegah gangguan benang dan memastikan bahwa data konsisten. Pada setiap titik waktu, hanya satu utas yang dapat mengakses blok atau metode tersinkronisasi (bagian penting) dengan mendapatkan kunci. Thread lain akan menunggu rilis kunci untuk mengakses bagian penting.

Kapan metode disinkronkan?

Metode disinkronkan saat Anda menambahkan synchronized untuk definisi metode atau deklarasi. Anda juga dapat menyinkronkan blok kode tertentu dengan-dalam suatu metode.

Apa artinya pro gramatikal dan logis?

Itu berarti hanya satu utas yang dapat mengakses bagian penting dengan mendapatkan kunci. Kecuali utas ini melepaskan kunci ini, semua utas lainnya harus menunggu untuk mendapatkan kunci. Mereka tidak memiliki akses untuk masuk bagian penting tanpa kunci yang didapat.

Ini tidak bisa dilakukan dengan sihir. Ini tanggung jawab programmer untuk mengidentifikasi bagian penting dalam aplikasi dan menjaganya sesuai. Java menyediakan kerangka kerja untuk menjaga aplikasi Anda, tetapi di mana dan semua bagian yang harus dijaga adalah tanggung jawab programmer.

Lebih detail dari dokumentasi java halaman

Kunci dan Sinkronisasi Intrinsik:

Sinkronisasi dibangun di sekitar entitas internal yang dikenal sebagai kunci intrinsik atau kunci monitor. Kunci intrinsik memainkan peran dalam kedua aspek sinkronisasi: menegakkan akses eksklusif ke status objek dan membangun hubungan yang terjadi sebelum hubungan yang penting untuk visibilitas.

Setiap benda memiliki kunci intrinsik yang terkait dengannya. Dengan konvensi, thread yang membutuhkan akses eksklusif dan konsisten ke bidang objek harus mendapatkan kunci intrinsik objek sebelum mengaksesnya, dan kemudian lepaskan kunci intrinsik ketika selesai dengan mereka.

Sebuah utas dikatakan memiliki kunci intrinsik antara saat ia memperoleh kunci dan melepaskan kunci. Selama sebuah benang memiliki kunci intrinsik, tidak ada benang lain yang dapat memperoleh kunci yang sama. Thread lain akan memblokir ketika mencoba untuk mendapatkan kunci.

Ketika sebuah thread melepaskan kunci intrinsik, hubungan yang terjadi sebelum terbentuk antara tindakan itu dan setiap akuisisi berikutnya dari kunci yang sama.

Membuat metode tersinkronisasi memiliki dua efek:

Pertama, tidak mungkin dua invokasi dari metode yang disinkronkan pada objek yang sama ke interleave.

Ketika satu thread mengeksekusi suatu metode tersinkronisasi untuk suatu objek, semua thread lain yang memanggil metode tersinkronisasi untuk blok objek yang sama (menangguhkan eksekusi) sampai thread pertama dilakukan dengan objek.

Kedua, ketika metode tersinkronisasi keluar, secara otomatis menetapkan hubungan yang terjadi sebelum dengan doa berikutnya dari metode yang disinkronkan untuk objek yang sama.

Ini menjamin bahwa perubahan status objek terlihat oleh semua utas.

Cari alternatif lain untuk sinkronisasi di:

Hindari disinkronkan (ini) di Java?


11
2017-12-14 06:56



Untuk pemahaman saya disinkronkan pada dasarnya berarti bahwa kompiler menulis monitor.pusat dan monitor. Tuliskan di sekitar metode Anda. Karena itu mungkin aman thread tergantung pada bagaimana itu digunakan (yang saya maksud adalah Anda dapat menulis objek dengan metode yang disinkronisasi yang tidak threadsafe tergantung pada apa yang kelas Anda lakukan).


6
2017-07-06 07:01



Saya tahu bahwa Anda sudah mendapatkan jawaban Anda.
 Saya menulis ini, hanya untuk membantu orang-orang yang memiliki pertanyaan yang sama dan mencari halaman ini untuk jawaban.
  di sini adalah penjelasan dari dokumentasi java :

Pertimbangkan kode berikut:

public class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }
}

jika count adalah contoh dari SynchronizedCounter kemudian membuat metode ini disinkronkan memiliki dua efek:

  • Pertama, tidak mungkin dua invokasi dari metode yang disinkronkan pada objek yang sama ke interleave. Ketika satu thread mengeksekusi suatu metode tersinkronisasi untuk suatu objek, semua thread lain yang memanggil metode tersinkronisasi untuk blok objek yang sama (menangguhkan eksekusi) sampai thread pertama dilakukan dengan objek.
  • Kedua, ketika metode tersinkronisasi keluar, secara otomatis menetapkan hubungan yang terjadi sebelum dengan doa berikutnya dari metode yang disinkronkan untuk objek yang sama. Ini menjamin bahwa perubahan status objek terlihat oleh semua utas.

5
2017-08-01 22:03