请问java中的lock和synchronized区别是什么? 请问java中的lock和synchronized区别是什么...

\u8bf7\u95eejava\u4e2d\u7684lock\u548csynchronized\u533a\u522b\u662f\u4ec0\u4e48\uff1f

1\u3001ReentrantLock \u62e5\u6709Synchronized\u76f8\u540c\u7684\u5e76\u53d1\u6027\u548c\u5185\u5b58\u8bed\u4e49\uff0c\u6b64\u5916\u8fd8\u591a\u4e86 \u9501\u6295\u7968\uff0c\u5b9a\u65f6\u9501\u7b49\u5019\u548c\u4e2d\u65ad\u9501\u7b49\u5019\uff1a
\u7ebf\u7a0bA\u548cB\u90fd\u8981\u83b7\u53d6\u5bf9\u8c61O\u7684\u9501\u5b9a\uff0c\u5047\u8bbeA\u83b7\u53d6\u4e86\u5bf9\u8c61O\u9501\uff0cB\u5c06\u7b49\u5f85A\u91ca\u653e\u5bf9O\u7684\u9501\u5b9a;
\u5982\u679c\u4f7f\u7528 synchronized \uff0c\u5982\u679cA\u4e0d\u91ca\u653e\uff0cB\u5c06\u4e00\u76f4\u7b49\u4e0b\u53bb\uff0c\u4e0d\u80fd\u88ab\u4e2d\u65ad;
\u5982\u679c \u4f7f\u7528ReentrantLock\uff0c\u5982\u679cA\u4e0d\u91ca\u653e\uff0c\u53ef\u4ee5\u4f7fB\u5728\u7b49\u5f85\u4e86\u8db3\u591f\u957f\u7684\u65f6\u95f4\u4ee5\u540e\uff0c\u4e2d\u65ad\u7b49\u5f85\uff0c\u800c\u5e72\u522b\u7684\u4e8b\u60c5\u3002

2\u3001synchronized\u662f\u5728JVM\u5c42\u9762\u4e0a\u5b9e\u73b0\u7684\uff0c\u4e0d\u4f46\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e9b\u76d1\u63a7\u5de5\u5177\u76d1\u63a7synchronized\u7684\u9501\u5b9a\uff0c\u800c\u4e14\u5728\u4ee3\u7801\u6267\u884c\u65f6\u51fa\u73b0\u5f02\u5e38\uff0cJVM\u4f1a\u81ea\u52a8\u91ca\u653e\u9501\u5b9a\uff0c\u4f46\u662f\u4f7f\u7528Lock\u5219\u4e0d\u884c\uff0clock\u662f\u901a\u8fc7\u4ee3\u7801\u5b9e\u73b0\u7684\uff0c\u8981\u4fdd\u8bc1\u9501\u5b9a\u4e00\u5b9a\u4f1a\u88ab\u91ca\u653e\uff0c\u5c31\u5fc5\u987b\u5c06unLock()\u653e\u5230finally{}\u4e2d\u3002

3\u3001\u5728\u8d44\u6e90\u7ade\u4e89\u4e0d\u662f\u5f88\u6fc0\u70c8\u7684\u60c5\u51b5\u4e0b\uff0cSynchronized\u7684\u6027\u80fd\u8981\u4f18\u4e8eReetrantLock\uff0c\u4f46\u662f\u5728\u8d44\u6e90\u7ade\u4e89\u5f88\u6fc0\u70c8\u7684\u60c5\u51b5\u4e0b\uff0cSynchronized\u7684\u6027\u80fd\u4f1a\u4e0b\u964d\u51e0\u5341\u500d\uff0c\u4f46\u662fReetrantLock\u7684\u6027\u80fd\u80fd\u7ef4\u6301\u5e38\u6001\u3002
Java\u662f\u4e00\u95e8\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u8bed\u8a00\uff0c\u4e0d\u4ec5\u5438\u6536\u4e86C++\u8bed\u8a00\u7684\u5404\u79cd\u4f18\u70b9\uff0c\u8fd8\u6452\u5f03\u4e86C++\u91cc\u96be\u4ee5\u7406\u89e3\u7684\u591a\u7ee7\u627f\u3001\u6307\u9488\u7b49\u6982\u5ff5\uff0c\u56e0\u6b64Java\u8bed\u8a00\u5177\u6709\u529f\u80fd\u5f3a\u5927\u548c\u7b80\u5355\u6613\u7528\u4e24\u4e2a\u7279\u5f81\u3002
Java\u8bed\u8a00\u4f5c\u4e3a\u9759\u6001\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u8bed\u8a00\u7684\u4ee3\u8868\uff0c\u6781\u597d\u5730\u5b9e\u73b0\u4e86\u9762\u5411\u5bf9\u8c61\u7406\u8bba\uff0c\u5141\u8bb8\u7a0b\u5e8f\u5458\u4ee5\u4f18\u96c5\u7684\u601d\u7ef4\u65b9\u5f0f\u8fdb\u884c\u590d\u6742\u7684\u7f16\u7a0b.

lock(), \u5982\u679c\u83b7\u53d6\u4e86\u9501\u7acb\u5373\u8fd4\u56de\uff0c\u5982\u679c\u522b\u7684\u7ebf\u7a0b\u6301\u6709\u9501\uff0c\u5f53\u524d\u7ebf\u7a0b\u5219\u4e00\u76f4\u5904\u4e8e\u4f11\u7720\u72b6\u6001\uff0c\u76f4\u5230\u83b7\u53d6\u9501
synchronized\u662f\u5728JVM\u5c42\u9762\u4e0a\u5b9e\u73b0\u7684\uff0c\u4e0d\u4f46\u53ef\u4ee5\u901a\u8fc7\u4e00\u4e9b\u76d1\u63a7\u5de5\u5177\u76d1\u63a7synchronized\u7684\u9501\u5b9a\uff0c\u800c\u4e14\u5728\u4ee3\u7801\u6267\u884c\u65f6\u51fa\u73b0\u5f02\u5e38\uff0cJVM\u4f1a\u81ea\u52a8\u91ca\u653e\u9501\u5b9a\uff0c\u4f46\u662f\u4f7f\u7528Lock\u5219\u4e0d\u884c\uff0clock\u662f\u901a\u8fc7\u4ee3\u7801\u5b9e\u73b0\u7684\uff0c\u8981\u4fdd\u8bc1\u9501\u5b9a\u4e00\u5b9a\u4f1a\u88ab\u91ca\u653e\uff0c\u5c31\u5fc5\u987b\u5c06unLock()\u653e\u5230finally{}\u4e2d

看我的专业回答!
1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候
线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,
如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断
如果 使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情

ReentrantLock获取锁定与三种方式:
a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
c)tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断

2、synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

3、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁

synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

  • 鐢辩敓浜ц/娑堣垂鑰呴棶棰樼湅JAVA澶氱嚎绋
    绛旓細import java util LinkedList; import ncurrent locks *; public class Sycn { private LinkedList<Object> myList = new LinkedList<Object>(); private int MAX = ; private final Lock lock = new ReentrantLock(); private final Condition full = lock newCondition(); private final Condition empty = loc...
  • Java缂栫▼涓殑鎬ц兘浼樺寲濡備綍瀹炵幇?
    绛旓細鍙互閫氳繃鐩稿叧鍛戒护姣斿top锛宲idstat锛屾壘鍑哄悇涓被鍨嬫秷鑰梒pu鐨勫崰姣旓紝鏈甯歌鐨勫氨鏄痷s鍜宻y绫诲瀷鍒嗗埆浠h〃鐢ㄦ埛杩涚▼娑堣楀拰绾跨▼闂村垏鎹㈡秷鑰楋紱濡傛灉us杩囬珮鍙互鎵惧埌鐩稿叧鐨勭嚎绋婭D鐒跺悗鍒嗘瀽浠g爜锛涘鏋渟y杩囬珮鏄笉鏄惎鍔ㄤ簡杩囧鐨勭嚎绋嬪鑷寸嚎绋嬪垏鎹㈣繃澶氾紱1.2鏂囦欢io娑堣 瑕佽窡韪嚎绋嬬殑鏂囦欢IO娑堣楋紝鍙互閫氳繃pidstat鏉ユ煡鎵撅紝鍙互鏌ュ埌姣...
  • java闇涓嶉渶瑕佸煿璁渶瑕佸鍒颁粈涔堢▼搴
    绛旓細鍚岀悊锛屼綘杩橀渶瑕佸Java骞跺彂缂栫▼鍜岀綉缁滅紪绋嬬殑浣跨敤鏂规硶涓庡簳灞傚疄鐜板師鐞嗛潪甯哥啛鎮夛紝涓嶄粎浠呯瓟鍑篘IO鍜孊IO鐨勫尯鍒紝鎴栬呮槸synchronized鍜宭ock鐨勫尯鍒紝浣犺繕闇瑕佺煡閬揘IO鐨勫簳灞傚疄鐜癳poll鏄粈涔堬紝synchronized瀵瑰簲鐨刴utex lock鏄粈涔堬紝lock鍜condition鐨勫疄鐜板師鐞嗗張鏄粈涔堬紝鑰宭ock鏈韩涔熸槸閫氳繃AQS銆丆AS鎿嶄綔绫荤瓑缁勪欢鏉ュ疄鐜扮殑锛屽叾涓...
  • 璺眰java涓鍏充簬鏁板埗杞崲鐨勪唬鐮,瑕佹暣鏁板拰灏忔暟閮借鐨
    绛旓細import java.text.SimpleDateFormat;import java.util.*;java.util.Date date = new java.util.Date();//濡傛灉甯屾湜寰楀埌YYYYMMDD鐨勬牸寮廠impleDateFormat sy1=new SimpleDateFormat("yyyyMMDD");String dateFormat=sy1.format(date);//濡傛灉甯屾湜鍒嗗紑寰楀埌骞达紝鏈堬紝鏃impleDateFormat sy=new SimpleDateFormat...
  • Java涓鎬庢牱瀹炵幇鎵归噺鍒犻櫎鎿嶄綔
    绛旓細鏈枃鏄褰Java涓瀹炵幇鎵归噺鍒犻櫎鎿嶇旱(Java瀵规暟鎹簱杩涜浜嬪姟澶勭疆),鍦ㄥ紑濮嬩箣鍓嶅厛鏉ョ湅涓婇潰杩欐牱鐨勪竴涓〉闈㈠浘: 涓婇潰杩欏紶鍥剧墖琛ㄧ幇鐨勬槸浠庢暟鎹簱涓煡璇㈠嚭鐨勫嚭绉熶俊鎭,淇℃伅涓繘琛屼簡鍒嗛〉澶勭疆,鐒跺悗姣忚鐨勫悗闈㈡彁渚涗簡涓涓閫夋寜閽拰瀵瑰簲鐨勪竴涓垹闄ゆ搷绾,鍙互閫変腑澶氫釜杩涜鎿嶇旱,杩欓噷涓昏鏄繘琛屽垹闄ゆ搷绾点傚湪鎵ц鍒犻櫎鎿嶇旱涔嬪墠鍏堣閫変腑瀵瑰簲鐨...
  • java鐢ㄤ簡sychoronized澶氱嚎绋 鍗栫エ闂 鍗栧嚭浜嗕袱涓涓寮犵エ
    绛旓細杩欓噷鐨剆ynchronized (aa)鐩存帴鏀逛负synchronized (鈥1鈥); 瀹炰緥鍙橀噺String aa = new String("1");鍙互鍘绘帀浜嗭紝浣犲湪涓嬮潰鍚敤绾跨▼鐨勬椂鍊欐槸涓や釜瀵硅薄锛屼笉鏄悓涓涓璞★紝涓ユ牸鏉ヨ宸茬粡娌℃剰涔変簡锛屽彧鏄綘鐨則icket 鍙橀噺鏄痵tatic锛屽洜姝ゆ槸涓や釜瀹炰緥鍏变韩鐨勫彉閲忥紝杩欑涓滆タ姝g‘鐨勫仛娉曟槸ticket 澹版槑涓哄疄渚嬪彉閲忥紝Xc88 x...
  • java涓娉涘瀷鏄粈涔堟剰鎬,浣滅敤鏄粈涔?
    绛旓細java 娉涘瀷鏄痡ava SE 1.5鐨勬柊鐗规э紝娉涘瀷鐨勬湰璐ㄦ槸鍙傛暟鍖栫被鍨嬶紝涔熷氨鏄鎵鎿嶄綔鐨勬暟鎹被鍨嬭鎸囧畾涓轰竴涓弬鏁般傝繖绉嶅弬鏁扮被鍨嬪彲浠ョ敤鍦ㄧ被銆佹帴鍙e拰鏂规硶鐨勫垱寤轰腑锛屽垎鍒О涓烘硾鍨嬬被銆佹硾鍨嬫帴鍙c佹硾鍨嬫柟娉曘傛硾鍨嬶紙Generic type 鎴栬 generics锛夋槸瀵 Java 璇█鐨勭被鍨嬬郴缁熺殑涓绉嶆墿灞曪紝浠ユ敮鎸佸垱寤哄彲浠ユ寜绫诲瀷杩涜鍙傛暟鍖栫殑...
  • java杩炴帴postgresql鍚,鐢╱pdate鏇存柊鏁版嵁鍑洪敊鈥斺攊nvalid input sy
    绛旓細鏁版嵁绫诲瀷涓嶆纭紝闇瑕佸鐞
  • 姹JAVA涓鍏充簬鍥捐薄绫荤殑鍑芥暟鐢ㄦ硶
    绛旓細sy1 - 婧愮煩褰㈢涓涓鐨 y 鍧愭爣銆俿x2 - 婧愮煩褰㈢浜屼釜瑙掔殑 x 鍧愭爣銆俿y2 - 婧愮煩褰㈢浜屼釜瑙掔殑 y 鍧愭爣銆俹bserver - 褰撶缉鏀惧苟杞崲浜嗘洿澶氬浘鍍忔椂瑕侀氱煡鐨勫璞° 杩斿洖:濡傛灉鍥惧儚鍍忕礌浠嶅湪鏀瑰彉,鍒欒繑鍥 false;鍚﹀垯杩斿洖 true銆俤rawImagepublic abstract boolean drawImage(Image img, int dx1, int dy1, int dx2, ...
  • 鍦java涓鍒╃敤闅忔満鏁板嚱鏁扮敓鎴愬瓧绗︿覆鐨勯棶棰
    绛旓細浣犲ソ锛屾寜鐓т綘鐨勮姹傚啓鐨勪唬鐮佸涓嬶紝缁欎簡娉ㄩ噴鍜岃繍琛岀粨鏋滐紝鍙互鐩存帴杩愯 public class test1 { public static void main(String[] args) { // 鎶0-9銆乤-z銆丄-Z鍏ㄥ瓨鍦ㄤ竴涓瓧绗︿覆閲 StringBuffer array = new StringBuffer();for (int i = 0; i <= 9; i++) { array.append(i);} for (...
  • 扩展阅读:美国macbookpro ... java windowbuilder ... java blockingqueue ... macbookpro13.3寸 ... java properties ... java中的throws ... 华为matebook14配置 ... java锁lock与sync的区别 ... volatile java ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网