日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

guava 并发_使用Guava对并发应用程序进行基于对象的微锁定

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 guava 并发_使用Guava对并发应用程序进行基于对象的微锁定 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

guava 并發

編寫并發Java應用程序時最令人討厭的問題之一是對線程之間共享的資源的處理,例如Web應用程序的會話和應用程序數據。 結果,如果應用程序的并發級別很低,許多開發人員選擇根本不同步這些資源。 例如,不太可能同時訪問會話資源:如果請求周期在短時間內完成,則在第一個請求周期仍在進行時,用戶不太可能使用第二個瀏覽器選項卡發送并發請求。 隨著Ajax驅動的Web應用程序的興起,這種信任方法的確變得越來越危險。 在Ajax應用程序中,例如,用戶可以在另一個瀏覽器窗口中啟動類似任務時,請求完成一項較長時間的任務。 如果這些任務訪問或寫入會話數據,則需要同步此類訪問。 否則,您將面臨細微的錯誤,甚至會遇到安全問題,例如本博客文章中指出的那樣 。

Java的synced關鍵字是引入鎖的一種簡單方法。 例如,此示例僅在需要將新實例寫入會話時才阻塞請求周期的線程。

HttpSession session = request.getSession(true); if (session.getAttribute("shoppingCart") == null) {synchronize(session) {if(session.getAttribute("shoppingCart")= null) {cart = new ShoppingCart();session.setAttribute("shoppingCart");}} } ShoppingCart cart = (ShoppingCart)session.getAttribute("shoppingCart"); doSomethingWith(cart);

此代碼會將新的ShoppingCart實例添加到會話中。 每當找不到購物車時,該代碼將獲取當前用戶會話的監視器,并將新的ShoppingCart添加到當前用戶的HttpSession中。 但是,此解決方案具有以下缺點:

  • 每當通過與上述相同的方法將任何值添加到會話中時,任何正在訪問當前會話的線程都將阻塞。 當兩個線程嘗試訪問不同的會話值時,也會發生這種情況。 這將使應用程序的限制更加嚴格。
  • Servlet API實現可能選擇實現HttpSession而不是一個單例實例。 在這種情況下,整個同步將失敗。 (但是,這不是Servlet API的常見實現。)
  • 最好找到一個要與HttpSession實例進行同步的對象。 但是,創建此類對象并在不同線程之間共享它們會帶來相同的問題。 避免這種情況的一種好方法是使用既固有并發又允許使用弱鍵的Guava緩存:

    LoadingCache<String, Object> monitorCache = CacheBuilder.newBuilder().weakValues().build(new CacheLoader<String, Object>{public Object load(String key) {return new Object();}});

    現在,我們可以像這樣重寫鎖定代碼:

    HttpSession session = request.getSession(true); Object monitor = ((LoadingCache<String,Object>)session.getAttribute("cache")).get("shoppingCart"); if (session.getAttribute("shoppingCart") == null) {synchronize(monitor) {if(session.getAttribute("shoppingCart")= null) {cart = new ShoppingCart();session.setAttribute("shoppingCart");}} } ShoppingCart cart = (ShoppingCart)session.getAttribute("shoppingCart"); doSomethingWith(cart);

    Guava緩存是自填充的,將僅返回一個Monitor Object實例,該實例可用作對共享會話資源的鎖定,該資源由shoppingCart普遍標識。 Guava緩存由ConcurrentHashMap支持,該ConcurrentHashMap通過僅在映射鍵的哈希值存儲桶上進行同步來避免同步。 結果,使應用程序成為線程安全的,而不會全局阻止它。 另外,您不必擔心內存不足,因為如果不再使用監視器(和相關的緩存條目),則會被垃圾回收。 如果您不使用其他緩存,甚至可以考慮使用軟引用來優化運行時間。

    當然可以完善這種機制。 例如,除了返回Object實例之外,還可以返回ReadWriteLock。 同樣,在會話啟動時實例化LoadingCache也很重要。 例如,這可以通過HttpSessionListener實現。

    參考: My Daily Java博客上的JCG合作伙伴 Rafael Winterhalter提供的Guava使用并發應用程序的基于對象的微鎖定 。

    翻譯自: https://www.javacodegeeks.com/2013/12/object-based-micro-locking-for-concurrent-applications-by-using-guava.html

    guava 并發

    總結

    以上是生活随笔為你收集整理的guava 并发_使用Guava对并发应用程序进行基于对象的微锁定的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。