Sobes.tech
Middle

არის თუ არა ეს ლაზის ნაკადი უსაფრთხო კონსტრუქცია?

sobes.tech AI

პასუხი AI-სგან

lazy Kotlin-ში საწყისად არ არის თრედ-ფრენდლი. თრედ უსაფრთხოება მიღწეულია სპეციალური ინიცირების რეჟიმის მითითებით.

ხელმისაწვდომი რეჟიმები (სათვალთვალო LazyThreadSafetyMode):

  • SYNCHRONIZED: სტანდარტული. გამოიყენება ლოკი, რათა უზრუნველყოს, რომ მხოლოდ ერთი თრედი ინიცირებს მნიშვნელობას ერთ დროს. ყველა თრედი ხედავს ერთსა და იმავე ინიცირებულ მნიშვნელობას.
  • PUBLICATION: რამდენიმე თრედი ერთდროულად შეუძლია ინიცირება ლამბდა. პირველი თრედი, რომელიც წარმატებით ინიცირებს, მოგებას იღებს. სხვა შედეგები იგნორირებულია. მოლოდინში მყოფი თრედები მიიღებენ ან უკვე ინიცირებულ მნიშვნელობას, ან სხვა თრედის მიერ ინიცირებულ მნიშვნელობას.
  • NONE: არანაირი გარანტია თრედ-ფრენდლობის შესახებ. ყველაზე სწრაფი რეჟიმი. არ გამოიყენოთ ეს რეჟიმი, თუ არსებობს ალბათობა, რომ ერთდროულად რამდენიმე თრედი წვდომას ახდენს lazy თვისებაზე.

მაგალითი რეჟიმის ზუსტად მითითებით:

// თრედ-ფრენდლი SYNCHRONIZED რეჟიმი (სტანდარტული)
val safeLazyValue: String by lazy {
    // ინიცირების კოდი
    "თრედ-ფრენდლი სტრინგი (SYNCHRONIZED)"
}

// PUBLICATION რეჟიმი - შეიძლება ინიცირება რამდენიმე თრედის მიერ, მაგრამ შედეგი ერთია.
val publicationLazyValue: String by lazy(LazyThreadSafetyMode.PUBLICATION) {
    // ინიცირების კოდი
    "თრედ-ფრენდლი სტრინგი (PUBLICATION)"
}

// არათრედ-ფრენდლი რეჟიმი. სწრაფი, მაგრამ საშიში მრავალთრედულ გარემოში.
val unsafeLazyValue: String by lazy(LazyThreadSafetyMode.NONE) {
    // ინიცირების კოდი
    "არათრედ-ფრენდლი სტრინგი (NONE)"
}