singleton Bean ตอบสนองคำขอพร้อมกันอย่างไร

ฉันมีคำถามเกี่ยวกับวิธีการที่ singleton beans ให้บริการคำขอพร้อมกันโดยละเอียด

ฉันค้นหา StackOverflow เกี่ยวกับคำถามนี้แล้ว นี่คือตัวอย่างลิงก์จาก stackoverflow แต่ฉันพบเฉพาะรายละเอียดระดับสูงเท่านั้น ฉันต้องการรายละเอียดทั้งหมดเกี่ยวกับวิธีการที่ singleton bean ตอบสนองคำขอที่เกิดขึ้นพร้อมกัน และวิธีที่โปรเซสเซอร์ระบบจะมองเห็นคำขอเหล่านั้น

ฉันได้ค้นคว้าเกี่ยวกับการจัดการคำขอพร้อมกันในโปรเซสเซอร์ระบบออนไลน์ พวกเขากล่าวว่าตัวประมวลผลนั้นมีตัวกำหนดเวลาและผู้กำหนดตารางเวลานั้นจะตัดสินใจว่าคำขอใดที่จะได้รับการประมวลผล

ตกลงไม่เป็นไร. หากสมมติว่าฉันมีโปรเซสเซอร์หลักมากกว่าหนึ่งตัว ตัวกำหนดเวลาจะจัดการกับคำขอที่เกิดขึ้นพร้อมกันได้อย่างไร

ใครสามารถอธิบายให้ฉันทราบถึงกระบวนการทีละขั้นตอนว่า singleton bean จะให้บริการคำขอพร้อมกันใน JVM และระบบได้อย่างไร

ให้ฉันอธิบายด้วยตัวอย่างที่เป็นรูปธรรม ฉันมีชั้นเรียนเช่น Sports:

class Sports {
    public void playFootball() {
    }

    public void playVolleyBall() {
    }
}

มีคำขอเข้ามาสองรายการ คำขอแรกกำลังดำเนินการเมธอด playFootball บนอินสแตนซ์ซิงเกิลตันที่สร้างขึ้นของคลาส Sports ในเวลาเดียวกัน คำขออื่นกำลังดำเนินการเมธอด playVolleyBall บนอินสแตนซ์ซิงเกิลตันที่สร้างขึ้นเดียวกันของคลาส Sports

เป็นไปได้อย่างไรกับอินสแตนซ์เดี่ยว?


person saravanakumar    schedule 02.09.2014    source แหล่งที่มา
comment
ไม่ในคำตอบของลิงก์นั้นไม่ถูกต้องสำหรับคำถามนั้น ในผู้ใช้นั้นถามว่า singleton bean ทำหน้าที่ตามคำขอพร้อมกันได้อย่างไร แต่เขาให้คำตอบว่าจะทำให้ singleton bean ปลอดภัยต่อเธรดได้อย่างไร ในที่นี้ฉันไม่ได้ถามวิธีสร้าง singleton bean ที่ปลอดภัยสำหรับเธรด ฉันต้องการทราบตรรกะเบื้องหลังว่า singleton bean ให้บริการคำขอพร้อมกันอย่างไร   -  person saravanakumar    schedule 02.09.2014


คำตอบ (6)


ซาราวาน กุมาร,

ฉันเข้าใจแรงจูงใจเบื้องหลังคำถามของคุณ ก่อนที่ฉันจะเริ่มทำงานกับคอมไพเลอร์ ฉันก็มีความต้องการทราบข้อมูลภายในของ Java Virtual Machine ที่คล้ายกันมากเช่นกัน

ก่อนอื่นฉันรู้สึกประทับใจกับคำถามของคุณ ต้องมีจุดแตกต่างและความเข้าใจสองสามจุดจึงจะสามารถตอบคำถามของคุณได้ ประการแรก: รูปแบบซิงเกิลตันหรือบางครั้งเรียกว่ารูปแบบต่อต้าน ทำให้แน่ใจได้ว่า JVM (Java Virtual Machine) มีอินสแตนซ์เพียงอินสแตนซ์เดียวเท่านั้นที่พร้อมใช้งาน ซึ่งหมายความว่าเรากำลังแนะนำสถานะสากลในแอปพลิเคชันเป็นหลัก ฉันรู้ว่าคุณเข้าใจสิ่งนี้ แต่มันเป็นเพียงประเด็นของการชี้แจงเท่านั้น

ตอนนี้อวัยวะภายใน.

เมื่อเราสร้างอินสแตนซ์ของคลาส เรากำลังสร้างอ็อบเจ็กต์ที่อยู่ในหน่วยความจำที่ใช้ร่วมกันของ JVM ตอนนี้ เธรดเหล่านี้กำลังรันโค้ดที่ทำงานบนอินสแตนซ์เหล่านี้อย่างอิสระ แต่ละเธรดมีหน่วยความจำที่ใช้งานได้ ซึ่งจะเก็บข้อมูลจากหน่วยความจำหลักที่แชร์ระหว่างเธรดทั้งหมด นี่คือที่ที่มีการอ้างอิงถึงออบเจ็กต์ Singleton ที่คุณสร้างขึ้น โดยพื้นฐานแล้วสิ่งที่เกิดขึ้นคือ bytecode ที่สร้างขึ้นและเป็นตัวแทนของออบเจ็กต์ซิงเกิลที่คุณสร้างขึ้นนั้นกำลังถูกดำเนินการในแต่ละเธรดเหล่านี้

ตอนนี้ภายในของเหตุการณ์นี้เกิดขึ้นดังนี้:

แต่ละเธรด JVM มีสแต็ก JVM ส่วนตัว ซึ่งสร้างขึ้นพร้อมกันกับเธรด ตอนนี้ JVM มีฮีปที่แชร์ระหว่างเธรด JVM ทั้งหมด ฮีปคือพื้นที่ข้อมูลรันไทม์ที่ใช้จัดสรรหน่วยความจำสำหรับอินสแตนซ์คลาสและอาร์เรย์ทั้งหมด ฮีปถูกสร้างขึ้นเมื่อเริ่มต้นระบบ VM เมื่อเธรดของคุณร้องขออินสแตนซ์ซิงเกิลตัน มันจะชี้ไปที่การอ้างอิงในฮีปที่มีรหัสไบต์สำหรับซิงเกิลตันนี้อยู่ มันกำลังจะรันโค้ดที่เหมาะสม ในกรณีของคุณ จะดำเนินการวิธีแรกสำหรับคำขอแรกและวิธีที่สองสำหรับคำขอที่สอง สามารถทำได้เนื่องจากไม่มีการล็อกหรือข้อจำกัดที่ป้องกันไม่ให้คอมไพเลอร์ชี้ตัวนับโปรแกรมไปยังพื้นที่ในฮีปที่มีการจัดสรรอินสแตนซ์นี้ ข้อจำกัดเดียวที่คลาส Singleton วางบน Java Virtual Machine คือสามารถมีได้เพียงอินสแตนซ์เดียวในฮีปของคลาสนี้ แค่นั้นแหละ. นอกเหนือจากนั้น คุณสามารถอ้างอิงถึงมันได้ 100 เท่าจากวิธีการของคุณ คอมไพลเลอร์จะชี้ไปที่โค้ดไบต์เดียวกันและเพียงแค่รันมัน นี่คือเหตุผลที่เรามักต้องการให้คลาส Singleton ไร้สถานะ เพราะหากเราเข้าถึงเธรดใด ๆ เราไม่ต้องการให้ตัวแปรภายในถูกกลายพันธุ์เนื่องจากขาดการควบคุมการทำงานพร้อมกัน

โปรดแจ้งให้เราทราบหากคุณมีคำถามใดๆ

person Devarsh Desai    schedule 03.09.2014
comment
ขอบคุณมากสำหรับคำอธิบายของคุณ ตอนนี้ฉันเข้าใจแล้ว และฉันจะแจ้งให้คุณทราบหากฉันมีข้อสงสัยใดๆ - person saravanakumar; 03.09.2014
comment
ดีใจที่ได้ยิน Saravan Kumar! :0) โปรดติดต่อเราหากมีคำถามใดๆ เกิดขึ้น! - person Devarsh Desai; 03.09.2014
comment
@Devarsh Desai คำอธิบายที่ดี ... +1 - person Ashish Jagtap; 04.09.2014
comment
@157. คุณรู้อะไรเกี่ยวกับ GWT หรือไม่ ตอนนี้ฉันมีข้อกำหนดเล็กน้อยในแอปพลิเคชัน GWT ของฉัน คุณเห็นโพสต์ของฉันที่นี่ stackoverflow.com/questions/26654031/ - person saravanakumar; 30.10.2014
comment
พูดได้ดี @Dev. - person Arun; 22.11.2017

เมล็ดเดี่ยวในอุดมคติไม่ควรคงสถานะใดๆ ไว้ นั่นหมายความว่าจะไม่มีตัวแปรใด ๆ ที่เก็บสิ่งใด ๆ ที่เฉพาะเจาะจงสำหรับคำขอที่ให้บริการ

ดังนั้น singleton bean จะมีโค้ดไร้สถานะ (เช่น วิธีการควบคุม) ที่สามารถดำเนินการพร้อมกันสำหรับคำขอหลายรายการโดยไม่มีปัญหาเรื่องการทำงานพร้อมกัน

ตัวอย่างเช่นหาก singleton bean ของคุณต่อไปนี้:

@Service
public class Calculator {

   public int sum(int a, int b) {
        return a + b;
   } 

}

กล่าวง่ายๆ ก็คือ เมื่อ "คำขอ" สองตัวเรียกใช้เมธอด sum ของ bean ในเวลาเดียวกัน นั่นก็หมายความว่าเมธอด sum จะถูกดำเนินการพร้อมกันในสองเธรดที่ต่างกัน ดังนั้นพวกเขาจึงจะมีบริบทการดำเนินการของตนเองซึ่งจะไม่ทับซ้อนกัน สิ่งนี้จะช่วยให้พวกเขาทำงานพร้อมกันได้อย่างปลอดภัย

ถ้าถั่วชนิดเดียวกันต้องมีสถานะดังนี้

@Service
public class Calculator {

   int incrementalMultiplier = 0;

   public int mulitply(int a, int b) {
        incrementalMultiplier++;
        return a * b * incrementalMultiplier;
   } 

}

ซึ่งอาจทำให้เกิดปัญหาเมื่อให้บริการสองคำขอพร้อมกัน เนื่องจาก incrementalMultiplier เป็นสถานะระดับออบเจ็กต์ที่จะใช้ร่วมกันโดยทั้งสองคำขอ (เธรด) และด้วยเหตุนี้จึงสามารถสร้างผลลัพธ์ที่ไม่คาดคิดได้

กล่าวโดยสรุป ซิงเกิลตันไร้สถานะจะสามารถให้บริการสองคำขอพร้อมกันได้ เนื่องจากคำขอเหล่านั้นจะอยู่คนละเธรด

person Varun Phadnis    schedule 02.09.2014
comment
แน่นอนและฉันต้องการทราบว่า stateless bean นี้ให้บริการตามคำขอพร้อมกันได้อย่างไร - person saravanakumar; 02.09.2014
comment
พยายามอธิบายให้ละเอียดมากขึ้นด้วยเงื่อนไขง่ายๆ... แจ้งให้เราทราบซึ่งจะช่วยได้ :) - person Varun Phadnis; 02.09.2014
comment
ใช่ เธรดมีหน่วยความจำสแต็กของตัวเอง และจะเก็บชื่อวิธีการและตัวแปรวิธีการสำหรับแต่ละเธรดแยกกัน หากบริบทการดำเนินการจะแตกต่างกันสำหรับแต่ละคำขอ bean เดียวกันจะให้บริการบริบทที่แตกต่างกันสองรายการในเวลาเดียวกันได้อย่างไร - person saravanakumar; 02.09.2014
comment
เมื่อคุณคิดในระดับของการรันเธรด วิธีการของ bean ก็จะกลายเป็นโค้ดบางส่วนที่ต้องดำเนินการ ทำไมคุณถึงคิดว่าสองเธรดไม่สามารถรันโค้ดเดียวกันพร้อมกันได้ เนื่องจากพวกมันอยู่ในบริบทของตัวเองและแยกออกจากกัน มันจึงค่อนข้างคล้ายคลึงกับโปรแกรมเดียวกันที่ทำงานบนคอมพิวเตอร์สองเครื่องที่แตกต่างกัน - person Varun Phadnis; 02.09.2014
comment
ใช่ มันควรจะดำเนินการ ฉันกำลังถามว่าตรรกะเบื้องหลังหน้าจอคืออะไร พวกเขาทำงานสองอย่างที่แตกต่างกันหรือเหมือนกันกับ single bean ได้อย่างไร ตอนนี้ฉันเข้าใจได้บ้างแล้ว แต่ขอโทษด้วยที่ฉันยังไม่ชัดเจน คุณช่วยอธิบายฉันอย่างละเอียดได้ไหมว่าบุคคลทางไฟฟ้า (singleton bean) จะทำงานเดียวกัน (วิธีการ) ในแต่ละครั้งในสถานที่ต่างกันได้อย่างไร (บริบทการดำเนินการเธรด) - person saravanakumar; 02.09.2014
comment
bean ไม่ทำงานใด ๆ เนื่องจากทั้งสองเธรดกำลังดำเนินการเนื้อความของโค้ดที่กำหนดไว้ใน bean พร้อม ๆ กัน ฉันสงสัยว่าคุณไม่เข้าใจเนื่องจากความเข้าใจ CS ขั้นพื้นฐานของคุณไม่ชัดเจนนัก ฉันอยากจะแนะนำให้อ่านแนวคิดพื้นฐาน ทำความเข้าใจว่าเกิดอะไรขึ้นเมื่อโค้ดทำงาน - person Varun Phadnis; 02.09.2014
comment
ขอบคุณสำหรับเวลาของคุณและคำอธิบายที่ดีสำหรับฉัน และคุณสงสัยถูกต้อง ฉันไม่เก่งเรื่อง CS พื้นฐานมากนัก เพราะโดยพื้นฐานแล้วฉันเป็นวิศวกรไฟฟ้า แต่ตอนนี้ฉันเป็นวิศวกรซอฟต์แวร์ - person saravanakumar; 03.09.2014
comment
อธิบายได้เยี่ยม!! - person Abhishek Kumar; 09.12.2020

หากต้องการทราบรายละเอียด singleton Bean ให้บริการคำขอพร้อมกันอย่างไร คุณต้องรู้สิ่งต่อไปนี้เกี่ยวกับ Spring Beans

  • ขอบเขต Bean

    Spring มีขอบเขต bean ที่แตกต่างกัน (เช่น Prototype, Singleton ฯลฯ) แต่ขอบเขตทั้งหมดเหล่านี้จะบังคับใช้เมื่อมีการสร้าง bean ขึ้น ตัวอย่างเช่น บีนที่กำหนดขอบเขต "ต้นแบบ" จะถูกสร้างขึ้นทุกครั้งที่บีนนี้ถูก "ฉีด" ในขณะที่ bean ที่มีขอบเขต "singleton" จะถูกสร้างขึ้นเพียงครั้งเดียวและแชร์ภายในบริบทของแอปพลิเคชัน
    ที่กำหนดขอบเขต "singleton" เป็นขอบเขตเริ่มต้นของ Spring Bean

  • การสร้าง Bean

    วงจรชีวิตทั้งหมดของ Spring Bean ได้รับการจัดการโดย Spring Container (เช่น ApplicationContext/BeanFacotry) Spring Container อ้างอิงภายในคำจำกัดความ bean (เช่น ฐาน XML และอิงคำอธิบายประกอบ) สำหรับการสร้างอินสแตนซ์ที่แท้จริงของคลาสที่กำหนดโดยคำจำกัดความ bean นั้น ตอนนี้เมื่อ Spring Container เริ่มต้นใช้งานมันจะอ้างถึงคำจำกัดความ bean และสร้าง bean ที่กำหนดไว้ทั้งหมด

  • ขอ Bean

    ตอนนี้เมื่ออ็อบเจ็กต์ของคุณส่งคำขอไปยัง bean จากนั้น Spring Container จะส่งมอบ bean ที่ได้เตรียมใช้งานไว้แล้ว

  • ฤดูใบไม้ผลิ ขอบเขตถั่ว

  • เธรดวัตถุ Spring ปลอดภัยหรือไม่

  • บทช่วยสอนช่วงฤดูใบไม้ผลิ 11 - การทำความเข้าใจขอบเขต Bean< /แข็งแกร่ง>

หวังว่านี่จะช่วยคุณได้...

person Ashish Jagtap    schedule 02.09.2014
comment
ใช่คุณถูกต้องและขอบคุณสำหรับการตอบกลับของคุณ แต่ฉันไม่เห็นคำอธิบายใด ๆ เกี่ยวกับคำถามของฉัน (Singleton Bean ให้บริการคำขอพร้อมกันอย่างไร) ในคำตอบข้างต้น - person saravanakumar; 02.09.2014
comment
สำหรับแต่ละคำขอไปยังคอนเทนเนอร์ Singleton Bean จะให้ bean แก่คุณซึ่งเริ่มต้นแล้ว ณ เวลาเริ่มต้นของคอนเทนเนอร์ - person Ashish Jagtap; 02.09.2014
comment
สำหรับคำขอแต่ละรายการไปยังคอนเทนเนอร์ Singleton Bean จะให้ bean เดียวกัน แก่คุณ ซึ่งเริ่มต้นแล้ว ณ เวลาเริ่มต้นของคอนเทนเนอร์ และมันจะให้ bean เดียวกันในเวลาที่ขอพร้อมกันได้อย่างไร และ bean เดียวกันจะทำงานเดียวกัน (วิธีการเดียวกันในชั้นเรียน) หรืองานที่แตกต่างกัน (วิธีที่แตกต่างกันในชั้นเรียนเดียวกัน) ในคำขอพร้อมกันได้อย่างไร - person saravanakumar; 02.09.2014

ฉันได้เห็นคำเตือนมากมายที่ทำให้ singleton beans ที่ใช้ร่วมกันเป็นแบบไร้สัญชาติ และฉันต้องการนำเสนอกรณีการใช้งานที่ singleton แบบ stateful ใน web app backing bean นั้นสมเหตุสมผล

ฉันมีเว็บแอปการดูแลระบบที่สอบถามข้อมูลผู้ใช้สองระบบแยกจากกัน (CRM และ Digital Assets Manager - DAM) ตามความต้องการ เปรียบเทียบบันทึก และอัปเดต DAM ตามนั้นโดยใช้ API บางครั้งอาจใช้เวลานานมากหากมีการอัปเดตจำนวนมาก UI บนเว็บจะแสดงสถานะของการอัปเดตแบบเรียลไทม์ เนื่องจากเบราว์เซอร์สำรวจ Backing Bean โดยใช้ Ajax ทุกวินาทีเพื่อแสดงแถบความคืบหน้าและจำนวนบัญชีผู้ใช้ที่ประมวลผล UI ยังมีปุ่มเพื่อเริ่มกระบวนการซิงค์และปุ่มเพื่อหยุด ปุ่มซิงค์ถูกเปิดใช้งานในตอนแรก และปุ่มหยุดไม่แสดงผล หลังจากที่ผู้ใช้คลิกปุ่มเริ่มต้น ปุ่มเริ่มต้นจะถูกปิดใช้งาน และปุ่มหยุดจะเปิดใช้งานการแสดงผล

ในขณะที่การซิงค์ทำงานอยู่ ฉันต้องการให้ไคลเอนต์ที่แตกต่างกัน (ผู้ใช้ที่แตกต่างกันบนแป้นพิมพ์ที่ใช้เว็บแอปในเบราว์เซอร์แยกต่างหาก) เห็นสถานะเดียวกัน กล่าวคือ แถบความคืบหน้าและจำนวนบัญชีผู้ใช้ที่ประมวลผล และสถานะของปุ่ม นี่เป็นสิ่งสำคัญเนื่องจากมันไม่สมเหตุสมผลเลยที่จะเริ่มกระบวนการซิงค์ครั้งที่สองในขณะที่กระบวนการหนึ่งอยู่ในระหว่างดำเนินการอยู่แล้ว

person snakedog    schedule 24.08.2017

คำถามนี้มีอายุมากกว่า 5 ปีแล้ว (2019) และฉันหวังว่าคุณจะพบสิ่งที่คุณกำลังมองหา แต่ฉันจะยังคงโพสต์คำตอบ สิ่งนี้อาจไม่เพียงครอบคลุมคำถามของคุณ แต่ยังอธิบายพฤติกรรมแบบมัลติเธรดโดยสรุปอีกด้วย

ก่อนอื่นเลย. singleton คือรูปแบบการออกแบบที่ใช้ในการเขียนโปรแกรม ซึ่งใช้เพื่อสร้างอินสแตนซ์เดียวสำหรับแอปพลิเคชันทั้งหมด (เพียงอินสแตนซ์เดียวสำหรับ JVM เพราะฉันหวังว่าจะมี JVM เพียงตัวเดียวในแอปของคุณ) การมัลติเธรดเป็นกลไกการประมวลผล มันดำเนินงานไปพร้อมๆ กัน ฉันคิดว่าคุณสับสนเพราะคุณรู้อยู่แล้วว่าเธรดเป็นสถานที่ประมวลผลเชิงตรรกะ และวัตถุก็เป็นอินสแตนซ์ของหน่วยความจำ แต่คุณไม่เข้าใจว่าการทำงานแบบมัลติเธรดทำงานอย่างไรภายใต้ประทุน สำหรับคำถามของคุณ ฉันจะอธิบายเรื่องนี้โดยใช้ Spring Framework

ดังนั้นเมื่อผู้ใช้ส่งคำขอไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะจัดสรรเธรดแยกต่างหากสำหรับแต่ละคำขอ และในฤดูใบไม้ผลิ ถั่วจะเป็นซิงเกิลตันตามค่าเริ่มต้น ดังนั้นคำขอแรกจึงเริ่มดำเนินการวิธีการของ singleton bean ของคุณ และก่อนที่มันจะเสร็จสิ้น คำขออื่นก็มาและจะดำเนินการวิธีเดียวกันโดยใช้เธรดอื่น

ดังนั้นสิ่งที่เกิดขึ้นที่นี่คือเธรดที่สองจะไม่รอให้เธรดแรกดำเนินการเมธอดทั้งหมดให้เสร็จสิ้น พวกเขาดำเนินการพร้อมกัน หมายความว่าคำขอแรกจะรันบรรทัดแรกของเมธอด จากนั้นเธรดที่สองจะเริ่มรันบรรทัดแรก และบางทีอาจเป็นบรรทัดที่สองด้วย โปรดทราบว่าในขณะที่เธรดแรกดำเนินการบรรทัดแรก เธรดที่สองจะไม่สามารถดำเนินการบรรทัดเดียวกันได้ และในขณะที่เธรดที่สองดำเนินการบรรทัดแรกและบรรทัดที่สอง เธรดแรกจะไม่สามารถดำเนินการบรรทัดที่สองได้จนกว่าเธรดที่สองจะเสร็จสิ้นบรรทัดที่สอง

แม้ว่าเราจะเรียกการดำเนินการนี้พร้อมกัน แต่ก็ไม่ได้ดำเนินการพร้อมกันเลย (หนึ่งบรรทัดถูกดำเนินการโดยเธรดเดียวในเวลาเดียวกัน) ตามคำถามของคุณ คุณได้กำหนดสองวิธีใน bean ดังนั้นจึงเป็นวิธีการแยกกัน ดังนั้นสองเธรดที่ร้องขอทั้งสองวิธีพร้อมกันจะดำเนินการพร้อมกัน ดังนั้นสิ่งที่ฉันได้อธิบายไว้จะไม่นำไปใช้กับสถานการณ์นั้น และหาก bean ของคุณถูกสร้างขึ้นใหม่สำหรับแต่ละคำขอ สิ่งนี้ก็จะไม่เกิดขึ้นและพวกมันจะดำเนินการพร้อมกัน

person Tharindu Eranga    schedule 23.12.2019
comment
ย่อหน้าสุดท้ายที่สองของคุณทำให้ฉันนึกถึงภาพยนตร์ แม้ว่าจะพยายามดี! - person Ram; 05.07.2021
comment
@Ram ใช่มันยากที่จะอธิบายการทำงานพร้อมกันโดยใช้เพียงข้อความเท่านั้น - person Tharindu Eranga; 07.07.2021

Singleton เป็นขอบเขตถั่ว คุณต้องจัดการวิธีการให้บริการสำหรับการเข้าถึงหลายเธรด คุณสามารถใช้การซิงโครไนซ์หรือแพ็คเกจพร้อมกันได้ อ้างอิง: Spring singleton beans thread ปลอดภัยหรือไม่

สำหรับคำขอที่เกิดขึ้นพร้อมกัน single bean จะให้บริการสำหรับคำขอหลายรายการทีละรายการ

person CHowdappaM    schedule 02.09.2014
comment
หาก singleton bean จะให้บริการคำร้องขอพร้อมกันทีละวิธี แล้วทำไมเราถึงทำการซิงโครไนซ์เพราะคำขอจะได้รับการประมวลผลทีละรายการ ฉันถูกไหม ? - person saravanakumar; 02.09.2014
comment
การร้องขอที่เกิดขึ้นพร้อมกันจะเริ่มต้นการเรียกใช้เมธอดทีละรายการ (แม้ว่าจะยังไม่ถูกต้องทั้งหมดก็ตาม) แต่การดำเนินการอาจถูกระงับไว้ล่วงหน้า เพื่อให้เธรดใหม่เริ่มต้นการเรียกใช้เมธอดเดียวกัน ปัญหาคือ ถ้า bean เป็นซิงเกิลตัน ระบบจะใช้อินสแตนซ์เดียวกัน และการดำเนินการทั้งสองเห็นฟิลด์เดียวกันของซิงเกิลตัน มันอาจเกิดขึ้น (และมันเกิดขึ้น) ที่คุณได้ดำเนินการครั้งแรกตั้งค่าของฟิลด์ จากนั้นจึงได้รับการยกเว้นล่วงหน้า และเริ่มการร้องขอครั้งที่สอง หากการเรียกใช้ครั้งที่สองเปลี่ยนค่าของฟิลด์เหล่านั้น การเรียกใช้ครั้งแรกจะอ่านค่าที่เปลี่ยนแปลง - person Dan M; 02.09.2014
comment
@Dan M ใช่แล้วจริงๆ แต่นั่นไม่ใช่ข้อสงสัยของฉัน bean ของฉันไม่มีสถานะใด ๆ และประกาศว่าเป็น FINAL เพื่อให้เป็น thread safe bean ฉันสงสัยว่า bean เดียวกัน (Singleton bean) และเวลาเดียวกันจะให้บริการตามคำขอสองรายการขึ้นไปได้อย่างไร - person saravanakumar; 02.09.2014