สภาพการแข่งขันเป็นตัวแปรด้วยวิธีคงที่

ฉันมีวิธีการดังต่อไปนี้:

public static void method() {

int i = 0;
i = i + 1;

}

ฉันมีตัวแปร int ภายในวิธีการแบบคงที่ และวิธีการเข้าถึงได้หลายเธรด
คำถามของฉันคือ:

  1. ตัวแปร i เป็นไปตามสภาวะการแข่งขันหรือไม่
  2. จะเกิดอะไรขึ้นหากวิธีการเข้าถึงใน Spring Web Application และเข้าถึงโดยผู้ใช้หลายคนพร้อมกัน

person Lakmal Vithanage    schedule 23.02.2017    source แหล่งที่มา
comment
อ้างอิง stackoverflow.com/q/17343157/2809326นี้   -  person arjun    schedule 23.02.2017
comment
@ElliottFrisch ไม่ใช่ thread-local แต่เป็นตัวแปรสแต็ก (ความแตกต่างคือการกลับเข้ามาใหม่)   -  person chrylis -cautiouslyoptimistic-    schedule 23.02.2017


คำตอบ (2)


หากมีการประกาศตัวแปรภายในเมธอด ตัวแปรนั้นก็จะอยู่ในสแต็กเฟรมที่จัดเตรียมไว้สำหรับการเรียกใช้เมธอดครั้งเดียว เข้าถึง stackframe ได้โดยเธรดที่เรียกใช้เมธอดเท่านั้น ไม่มีสภาวะการแข่งขันในตัวอย่างที่โพสต์ ทุกการเรียกใช้เมธอดจะได้รับสำเนาของตัวแปรของตัวเอง คุณต้องมีสถานะที่ใช้ร่วมกันเพื่อที่จะมีสภาพการแข่งขัน

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

person Nathan Hughes    schedule 23.02.2017

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

person Arvind Kumar Maurya    schedule 09.10.2019