การซิงโครไนซ์หมายถึงมัลติเธรด บล็อกโค้ดที่ซิงโครไนซ์สามารถดำเนินการได้ครั้งละหนึ่งเธรดเท่านั้น Java รองรับหลายเธรดสำหรับการดำเนินการ ซึ่งอาจส่งผลให้เธรดตั้งแต่สองเธรดขึ้นไปเข้าถึงฟิลด์หรือวัตถุเดียวกัน การซิงโครไนซ์เป็นกระบวนการที่อนุญาตให้เธรดแบบขนานทั้งหมดในโปรแกรมทำงานพร้อมกัน การซิงโครไนซ์จะหลีกเลี่ยงข้อผิดพลาดด้านความสอดคล้องของหน่วยความจำที่เกิดจากการเข้าถึงหน่วยความจำที่ใช้ร่วมกันไม่สอดคล้องกัน เมื่อมีการประกาศวิธีการซิงโครไนซ์ เธรดจะเก็บจอภาพสำหรับออบเจ็กต์ที่กำลังดำเนินการวิธีการอยู่ หากเธรดอื่นกำลังดำเนินการวิธีการซิงโครไนซ์ เธรดของคุณจะถูกบล็อกจนกว่าเธรดอื่นจะปล่อยจอภาพ การซิงโครไนซ์ทำได้ใน Java โดยใช้คำ
synchronized
สงวน คุณสามารถใช้มันในชั้นเรียนของคุณโดยกำหนดวิธีการหรือบล็อกที่ซิงโครไนซ์ คุณจะไม่สามารถใช้synchronized
ตัวแปรหรือแอตทริบิวต์ในคำจำกัดความของคลาสได้
การล็อคระดับวัตถุ
นี่เป็นกลไกสำหรับการซิงโครไนซ์วิธีการที่ไม่คงที่หรือบล็อกของโค้ดที่ไม่คงที่เพื่อให้มีเพียงเธรดเดียวเท่านั้นที่สามารถดำเนินการบล็อกหรือวิธีการที่กำหนดบนอินสแตนซ์ที่กำหนดของคลาส ซึ่งควรทำทุกครั้งที่คุณต้องการทำให้เธรดข้อมูลระดับอินสแตนซ์ปลอดภัย ตัวอย่าง:public class DemoClass{
public synchronized void demoMethod(){}
}
หรือ
public class DemoClass{
public void demoMethod(){
synchronized (this) {
//other thread safe code
}
}
}
หรือ
public class DemoClass{
private final Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
การล็อคระดับชั้นเรียน
ป้องกันไม่ให้หลายเธรดเข้าสู่บล็อกที่ซิงโครไนซ์ระหว่างการดำเนินการในอินสแตนซ์ที่มีอยู่ของคลาส ซึ่งหมายความว่าหากมี 100 อินสแตนซ์ของคลาสระหว่างการทำงานของโปรแกรมDemoClass
ในเวลานั้นจะมีเพียงเธรดเดียวเท่านั้นที่สามารถดำเนินการได้demoMethod()
ในกรณีใด ๆ และกรณีอื่น ๆ ทั้งหมดจะถูกบล็อกสำหรับเธรดอื่น นี่เป็นสิ่งจำเป็นเมื่อคุณต้องการทำให้เธรดข้อมูลแบบคงที่ปลอดภัย
public class DemoClass{
public synchronized static void demoMethod(){}
}
หรือ
public class DemoClass{
public void demoMethod(){
synchronized (DemoClass.class) {
//other thread safe code
}
}
}
หรือ
public class DemoClass
{
private final static Object lock = new Object();
public void demoMethod(){
synchronized (lock) {
//other thread safe code
}
}
}
หมายเหตุสำคัญบางประการ
- การซิงโครไนซ์ใน Java ช่วยให้มั่นใจได้ว่าไม่มีสองเธรดใดที่สามารถดำเนินการวิธีการซิงโครไนซ์พร้อมกันหรือแบบขนานได้
synchronized
สามารถใช้ได้กับวิธีการและบล็อคโค้ดเท่านั้น วิธีการหรือบล็อกเหล่านี้อาจเป็นแบบคงที่หรือไม่คงที่ก็ได้- เมื่อใดก็ตามที่เธรดเข้าสู่วิธีการซิงโครไนซ์หรือบล็อก เธรดนั้นจะได้รับการล็อค และเมื่อใดก็ตามที่เธรดออกจากวิธีการซิงโครไนซ์หรือบล็อก JVM จะปลดล็อก การล็อกจะถูกปล่อยแม้ว่าเธรดจะออกจากวิธีการซิงโครไนซ์หลังจากเสร็จสิ้นเนื่องจากข้อผิดพลาดหรือข้อยกเว้นใดๆ
synchronized
ใน Java หมายความ ว่าหากวิธีการซิงโครไนซ์เรียกวิธีการซิงโครไนซ์อื่นที่ต้องการการล็อคเดียวกัน เธรดปัจจุบันที่เก็บการล็อคสามารถเข้าสู่วิธีการนั้นโดยไม่ต้องรับการล็อค- Синхронизация в Java будет бросать
NullPointerException
если an object используемый в синхронизированном блоке null. Например, в вышеприведенном примере codeа, если замок инициализируется Hownull
, синхронизированный (lock) броситNullPointerException
. - Синхронизированные методы в Java вносят дополнительные затраты на производительность вашего applications. Так что используйте синхронизацию, когда она абсолютно необходима. Кроме того, рассмотрите вопрос об использовании синхронизированных блоков codeа для синхронизации только критических секций codeа.
- Вполне возможно, что и статический и не статический синхронизированные методы могут работать одновременно or параллельно, потому что они захватывают замок на другой an object.
- В соответствии со спецификацией языка вы не можете использовать
synchronized
в конструкторе это приведет к ошибке компиляции. - Не синхронизируйте по не финальному (no final) полю, потому что link, на не финальное поле может измениться в любое время, а затем другой поток может получить синхронизацию на разных an objectх и уже не будет ниHowой синхронизации вообще. Лучше всего использовать класс
String
, который уже неизменяемый и финальный.
GO TO FULL VERSION