java 实现线程同步的方式有哪些 Java 线程同步几种方式

Java\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65\u7684\u51e0\u79cd\u65b9\u5f0f

java\u4e2d\u591a\u7ebf\u7a0b\u7684\u5b9e\u73b0\u65b9\u6cd5\u6709\u4e24\u79cd\uff1a1.\u76f4\u63a5\u7ee7\u627fthread\u7c7b\uff1b2.\u5b9e\u73b0runnable\u63a5\u53e3\uff1b\u540c\u6b65\u7684\u5b9e\u73b0\u65b9\u6cd5\u6709\u4e94\u79cd\uff1a1.\u540c\u6b65\u65b9\u6cd5\uff1b2.\u540c\u6b65\u4ee3\u7801\u5757\uff1b3.\u4f7f\u7528\u7279\u6b8a\u57df\u53d8\u91cf(volatile)\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65\uff1b4.\u4f7f\u7528\u91cd\u5165\u9501\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65\uff1b5.\u4f7f\u7528\u5c40\u90e8\u53d8\u91cf\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65 \u3002
\u5176\u4e2d\u591a\u7ebf\u7a0b\u5b9e\u73b0\u8fc7\u7a0b\u4e2d\u9700\u6ce8\u610f\u91cd\u5199\u6216\u8005\u8986\u76d6run()\u65b9\u6cd5\uff0c\u800c\u5bf9\u4e8e\u540c\u6b65\u7684\u5b9e\u73b0\u65b9\u6cd5\u4e2d\u4f7f\u7528\u8f83\u5e38\u4f7f\u7528\u7684\u662f\u5229\u7528synchronized\u7f16\u5199\u540c\u6b65\u65b9\u6cd5\u548c\u4ee3\u7801\u5757\u3002

\uff081\uff09\u540c\u6b65\u65b9\u6cd5\uff1a
\u5373\u6709synchronized\u5173\u952e\u5b57\u4fee\u9970\u7684\u65b9\u6cd5\u3002 \u7531\u4e8ejava\u7684\u6bcf\u4e2a\u5bf9\u8c61\u90fd\u6709\u4e00\u4e2a\u5185\u7f6e\u9501\uff0c\u5f53\u7528\u6b64\u5173\u952e\u5b57\u4fee\u9970\u65b9\u6cd5\u65f6\uff0c\u5185\u7f6e\u9501\u4f1a\u4fdd\u62a4\u6574\u4e2a\u65b9\u6cd5\u3002\u5728\u8c03\u7528\u8be5\u65b9\u6cd5\u524d\uff0c\u9700\u8981\u83b7\u5f97\u5185\u7f6e\u9501\uff0c\u5426\u5219\u5c31\u5904\u4e8e\u963b\u585e\u72b6\u6001\u3002
\uff082\uff09\u540c\u6b65\u4ee3\u7801\u5757
\u5373\u6709synchronized\u5173\u952e\u5b57\u4fee\u9970\u7684\u8bed\u53e5\u5757\u3002\u88ab\u8be5\u5173\u952e\u5b57\u4fee\u9970\u7684\u8bed\u53e5\u5757\u4f1a\u81ea\u52a8\u88ab\u52a0\u4e0a\u5185\u7f6e\u9501\uff0c\u4ece\u800c\u5b9e\u73b0\u540c\u6b65
\uff083\uff09\u4f7f\u7528\u7279\u6b8a\u57df\u53d8\u91cf(Volatile)\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65
a.volatile\u5173\u952e\u5b57\u4e3a\u57df\u53d8\u91cf\u7684\u8bbf\u95ee\u63d0\u4f9b\u4e86\u4e00\u79cd\u514d\u9501\u673a\u5236
b.\u4f7f\u7528volatile\u4fee\u9970\u57df\u76f8\u5f53\u4e8e\u544a\u8bc9\u865a\u62df\u673a\u8be5\u57df\u53ef\u80fd\u4f1a\u88ab\u5176\u4ed6\u7ebf\u7a0b\u66f4\u65b0
c.\u56e0\u6b64\u6bcf\u6b21\u4f7f\u7528\u8be5\u57df\u5c31\u8981\u91cd\u65b0\u8ba1\u7b97\uff0c\u800c\u4e0d\u662f\u4f7f\u7528\u5bc4\u5b58\u5668\u4e2d\u7684\u503c
d.volatile\u4e0d\u4f1a\u63d0\u4f9b\u4efb\u4f55\u539f\u5b50\u64cd\u4f5c\uff0c\u5b83\u4e5f\u4e0d\u80fd\u7528\u6765\u4fee\u9970final\u7c7b\u578b\u7684\u53d8\u91cf
\uff084\uff09\u4f7f\u7528\u91cd\u5165\u9501\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65
\u5728JavaSE5.0\u4e2d\u65b0\u589e\u4e86\u4e00\u4e2ajava.util.concurrent\u5305\u6765\u652f\u6301\u540c\u6b65\u3002ReentrantLock\u7c7b\u662f\u53ef\u91cd\u5165\u3001\u4e92\u65a5\u3001\u5b9e\u73b0\u4e86Lock\u63a5\u53e3\u7684\u9501\uff0c \u5b83\u4e0e\u4f7f\u7528synchronized\u65b9\u6cd5\u548c\u5feb\u5177\u6709\u76f8\u540c\u7684\u57fa\u672c\u884c\u4e3a\u548c\u8bed\u4e49\uff0c\u5e76\u4e14\u6269\u5c55\u4e86\u5176\u80fd\u529b\u3002
\uff085\uff09\u4f7f\u7528\u5c40\u90e8\u53d8\u91cf\u5b9e\u73b0\u7ebf\u7a0b\u540c\u6b65

实现同步机制有两个方法:
1、同步代码块:
synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
2、同步方法:
public synchronized 数据返回类型 方法名(){}
就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
1,该类的对象可以被多个线程安全的访问。
2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。
2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

线程建立/执行:HANDLEHandle1;DWORDID1;Handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread1,NULL,0,&ID1);线程等待:WaitForSingleObject(Handle1,INFINITE);线程同步---生产者消费者:HANDLEm_S_Consumer;m_S_Consumer=CreateSemaphore(NULL,0,20,NULL);//创建,最多允许有20个产品等待使用,初始0个ReleaseSemaphore(m_S_Consumer,1,NULL);//生产1个if(WaitForSingleObject(m_S_Consumer,INFINITE)==WAIT_OBJECT_0){//消费1个}

扩展阅读:java启动线程的方法 ... java 线程池创建方式 ... java promise ... 线程池面试题 ... 线程同步的四种方式 ... loom java ... java python ... 如何实现线程同步 ... java创建线程的四种方式 ...

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