最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud?Feign使用ApacheHttpClient代替默認client方式

 更新時間:2022年03月09日 10:01:00   作者:過河的小卒子  
這篇文章主要介紹了SpringCloud?Feign使用ApacheHttpClient代替默認client方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

使用ApacheHttpClient代替默認client

ApacheHttpClient和默認實現(xiàn)的比較

  • Feign在默認情況下使用的是JDK原生的URLConnection發(fā)送HTTP請求,沒有連接池,但是對每個地址會保持一個長連接,即利用HTTP的persistence connection。
  • ApacheHttpClient實現(xiàn)了連接池,同時它封裝了訪問http的請求頭,參數(shù),內(nèi)容體,響應(yīng)等等,使客戶端發(fā)送 HTTP 請求變得容易。

ApacheHttpClient 使用

maven 依賴

? ? <dependency>
? ? ? ? <groupId>org.springframework.cloud</groupId>
? ? ? ? <artifactId>spring-cloud-starter-openfeign</artifactId>
? ? </dependency>
? ? <dependency>
? ? ? ? <groupId>org.apache.httpcomponents</groupId>
? ? ? ? <artifactId>httpclient</artifactId>
? ? ? ? <version>4.5.7</version>
? ? </dependency>
? ? <dependency>
? ? ? ? <groupId>io.github.openfeign</groupId>
? ? ? ? <artifactId>feign-httpclient</artifactId>
? ? ? ? <version>10.1.0</version>
? ? </dependency>

配置文件的修改

feign:
? httpclient:
? ? enabled: true

創(chuàng)建ApacheHttpClient客戶端

import javax.net.ssl.SSLContext;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.springframework.util.ResourceUtils;
import feign.httpclient.ApacheHttpClient;
@Slf4j
public class FeignClientBuilder {
? private boolean enabled;
? private String keyPassword;
? private String keyStore;
? private String keyStorePassword;
? private String trustStore;
? private String trustStorePassword;
? private int maxConnTotal = 2048;
? private int maxConnPerRoute = 512;
? public FeignClientBuilder(boolean enabled, String keyPassword, String keyStore, String keyStorePassword, String trustStore, String trustStorePassword, int maxConnTotal, int maxConnPerRoute) {
? ? this.enabled = enabled;
? ? this.keyPassword = keyPassword;
? ? this.keyStore = keyStore;
? ? this.keyStorePassword = keyStorePassword;
? ? this.trustStore = trustStore;
? ? this.trustStorePassword = trustStorePassword;
? ? /**
? ? ?* maxConnTotal是同時間正在使用的最多的連接數(shù)
? ? ?*/
? ? this.maxConnTotal = maxConnTotal;
? ? /**
? ? ?* maxConnPerRoute是針對一個域名同時間正在使用的最多的連接數(shù)
? ? ?*/
? ? this.maxConnPerRoute = maxConnPerRoute;
? }
? public ApacheHttpClient apacheHttpClient() {
? ? CloseableHttpClient defaultHttpClient = HttpClients.custom()
? ? ? ? ? ? .setMaxConnTotal(maxConnTotal)
? ? ? ? ? ? .setMaxConnPerRoute(maxConnPerRoute)
? ? ? ? ? ? .build();
? ? ApacheHttpClient defaultApacheHttpClient = new ApacheHttpClient(defaultHttpClient);
? ? if (!enabled) {
? ? ? return defaultApacheHttpClient;
? ? }
? ? SSLContextBuilder sslContextBuilder = SSLContexts.custom();
? ? // 如果 服務(wù)端啟用了 TLS 客戶端驗證,則需要指定 keyStore
? ? if (keyStore == null || keyStore.isEmpty()) {
? ? ? return new ApacheHttpClient();
? ? } else {
? ? ? try {
? ? ? ? sslContextBuilder
? ? ? ? ? ? ? ? .loadKeyMaterial(
? ? ? ? ? ? ? ? ? ? ? ? ResourceUtils.getFile(keyStore),
? ? ? ? ? ? ? ? ? ? ? ? keyStorePassword.toCharArray(),
? ? ? ? ? ? ? ? ? ? ? ? keyPassword.toCharArray());
? ? ? } catch (Exception e) {
? ? ? ? e.printStackTrace();
? ? ? }
? ? }
? ? // 如果 https 使用自簽名證書,則需要指定 trustStore
? ? if (trustStore == null || trustStore.isEmpty()) {
? ? } else {
? ? ? try {
? ? ? ? sslContextBuilder
// ? ? ? ?.loadTrustMaterial(TrustAllStrategy.INSTANCE)
? ? ? ? ? ? ? ? .loadTrustMaterial(
? ? ? ? ? ? ? ? ? ? ? ? ResourceUtils.getFile(trustStore),
? ? ? ? ? ? ? ? ? ? ? ? trustStorePassword.toCharArray()
? ? ? ? ? ? ? ? );
? ? ? } catch (Exception e) {
? ? ? ? e.printStackTrace();
? ? ? }
? ? }
? ? try {
? ? ? SSLContext sslContext = sslContextBuilder.build();
? ? ? SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
? ? ? ? ? ? ? sslContext,
? ? ? ? ? ? ? SSLConnectionSocketFactory.getDefaultHostnameVerifier());
? ? ? CloseableHttpClient httpClient = HttpClients.custom()
? ? ? ? ? ? ? .setMaxConnTotal(maxConnTotal)
? ? ? ? ? ? ? .setMaxConnPerRoute(maxConnPerRoute)
? ? ? ? ? ? ? .setSSLSocketFactory(sslsf)
? ? ? ? ? ? ? .build();
? ? ? ApacheHttpClient apacheHttpClient = new ApacheHttpClient(httpClient);
? ? ? log.info("feign Client load with ssl.");
? ? ? return apacheHttpClient;
? ? } catch (Exception e) {
? ? ? e.printStackTrace();
? ? }
? ? return defaultApacheHttpClient;
? }
? public static FeignClientBuilderBuilder builder() {
? ? return new FeignClientBuilderBuilder();
? }
? public static class FeignClientBuilderBuilder {
? ? private boolean enabled;
? ? private String keyPassword;
? ? private String keyStore;
? ? private String keyStorePassword;
? ? private String trustStore;
? ? private String trustStorePassword;
? ? private int maxConnTotal = 2048;
? ? private int maxConnPerRoute = 512;
? ? public FeignClientBuilderBuilder enabled(boolean enabled) {
? ? ? this.enabled = enabled;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder keyPassword(String keyPassword) {
? ? ? this.keyPassword = keyPassword;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder keyStore(String keyStore) {
? ? ? this.keyStore = keyStore;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder keyStorePassword(String keyStorePassword) {
? ? ? this.keyStorePassword = keyStorePassword;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder trustStore(String trustStore) {
? ? ? this.trustStore = trustStore;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder trustStorePassword(String trustStorePassword) {
? ? ? this.trustStorePassword = trustStorePassword;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder maxConnTotal(int maxConnTotal) {
? ? ? this.maxConnTotal = maxConnTotal;
? ? ? return this;
? ? }
? ? public FeignClientBuilderBuilder maxConnPerRoute(int maxConnPerRoute) {
? ? ? this.maxConnPerRoute = maxConnPerRoute;
? ? ? return this;
? ? }
? ? public FeignClientBuilder build() {
? ? ? return new FeignClientBuilder(
? ? ? ? ? ? ? this.enabled,
? ? ? ? ? ? ? this.keyPassword,
? ? ? ? ? ? ? this.keyStore,
? ? ? ? ? ? ? this.keyStorePassword,
? ? ? ? ? ? ? this.trustStore,
? ? ? ? ? ? ? this.trustStorePassword,
? ? ? ? ? ? ? this.maxConnTotal,
? ? ? ? ? ? ? this.maxConnPerRoute
? ? ? );
? ? }
? }
}

使用時可以直接使用builder來創(chuàng)建ApacheHttpClient。

apache的HttpClient默認重試機制

maven

? ? ? ? <dependency>
? ? ? ? ? ? <groupId>org.apache.httpcomponents</groupId>
? ? ? ? ? ? <artifactId>httpclient</artifactId>
? ? ? ? ? ? <version>4.5.2</version>
? ? ? ? </dependency>

異常重試log

2017-01-31 19:31:39.057  INFO 3873 --- [askScheduler-13] o.apache.http.impl.execchain.RetryExec   : I/O exception (org.apache.http.NoHttpResponseException) caught when processing request to {}->http://192.168.99.100:8080: The target server failed to respond
2017-01-31 19:31:39.058  INFO 3873 --- [askScheduler-13] o.apache.http.impl.execchain.RetryExec   : Retrying request to {}->http://192.168.99.100:8080

RetryExec

org/apache/http/impl/execchain/RetryExec.java

/**
?* Request executor in the request execution chain that is responsible
?* for making a decision whether a request failed due to an I/O error
?* should be re-executed.
?* <p>
?* Further responsibilities such as communication with the opposite
?* endpoint is delegated to the next executor in the request execution
?* chain.
?* </p>
?*
?* @since 4.3
?*/
@Immutable
public class RetryExec implements ClientExecChain {
? ? private final Log log = LogFactory.getLog(getClass());
? ? private final ClientExecChain requestExecutor;
? ? private final HttpRequestRetryHandler retryHandler;
? ? public RetryExec(
? ? ? ? ? ? final ClientExecChain requestExecutor,
? ? ? ? ? ? final HttpRequestRetryHandler retryHandler) {
? ? ? ? Args.notNull(requestExecutor, "HTTP request executor");
? ? ? ? Args.notNull(retryHandler, "HTTP request retry handler");
? ? ? ? this.requestExecutor = requestExecutor;
? ? ? ? this.retryHandler = retryHandler;
? ? }
? ? @Override
? ? public CloseableHttpResponse execute(
? ? ? ? ? ? final HttpRoute route,
? ? ? ? ? ? final HttpRequestWrapper request,
? ? ? ? ? ? final HttpClientContext context,
? ? ? ? ? ? final HttpExecutionAware execAware) throws IOException, HttpException {
? ? ? ? Args.notNull(route, "HTTP route");
? ? ? ? Args.notNull(request, "HTTP request");
? ? ? ? Args.notNull(context, "HTTP context");
? ? ? ? final Header[] origheaders = request.getAllHeaders();
? ? ? ? for (int execCount = 1;; execCount++) {
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? return this.requestExecutor.execute(route, request, context, execAware);
? ? ? ? ? ? } catch (final IOException ex) {
? ? ? ? ? ? ? ? if (execAware != null && execAware.isAborted()) {
? ? ? ? ? ? ? ? ? ? this.log.debug("Request has been aborted");
? ? ? ? ? ? ? ? ? ? throw ex;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if (retryHandler.retryRequest(ex, execCount, context)) {
? ? ? ? ? ? ? ? ? ? if (this.log.isInfoEnabled()) {
? ? ? ? ? ? ? ? ? ? ? ? this.log.info("I/O exception ("+ ex.getClass().getName() +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ") caught when processing request to "
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + route +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ": "
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? + ex.getMessage());
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (this.log.isDebugEnabled()) {
? ? ? ? ? ? ? ? ? ? ? ? this.log.debug(ex.getMessage(), ex);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? if (!RequestEntityProxy.isRepeatable(request)) {
? ? ? ? ? ? ? ? ? ? ? ? this.log.debug("Cannot retry non-repeatable request");
? ? ? ? ? ? ? ? ? ? ? ? throw new NonRepeatableRequestException("Cannot retry request " +
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "with a non-repeatable request entity", ex);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? request.setHeaders(origheaders);
? ? ? ? ? ? ? ? ? ? if (this.log.isInfoEnabled()) {
? ? ? ? ? ? ? ? ? ? ? ? this.log.info("Retrying request to " + route);
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? if (ex instanceof NoHttpResponseException) {
? ? ? ? ? ? ? ? ? ? ? ? final NoHttpResponseException updatedex = new NoHttpResponseException(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? route.getTargetHost().toHostString() + " failed to respond");
? ? ? ? ? ? ? ? ? ? ? ? updatedex.setStackTrace(ex.getStackTrace());
? ? ? ? ? ? ? ? ? ? ? ? throw updatedex;
? ? ? ? ? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? ? ? ? ? throw ex;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

DefaultHttpRequestRetryHandler

org/apache/http/impl/client/DefaultHttpRequestRetryHandler.java

/**
?* The default {@link HttpRequestRetryHandler} used by request executors.
?*
?* @since 4.0
?*/
@Immutable
public class DefaultHttpRequestRetryHandler implements HttpRequestRetryHandler {
? ? public static final DefaultHttpRequestRetryHandler INSTANCE = new DefaultHttpRequestRetryHandler();
? ? /** the number of times a method will be retried */
? ? private final int retryCount;
? ? /** Whether or not methods that have successfully sent their request will be retried */
? ? private final boolean requestSentRetryEnabled;
? ? private final Set<Class<? extends IOException>> nonRetriableClasses;
? ? /**
? ? ?* Create the request retry handler using the specified IOException classes
? ? ?*
? ? ?* @param retryCount how many times to retry; 0 means no retries
? ? ?* @param requestSentRetryEnabled true if it's OK to retry requests that have been sent
? ? ?* @param clazzes the IOException types that should not be retried
? ? ?* @since 4.3
? ? ?*/
? ? protected DefaultHttpRequestRetryHandler(
? ? ? ? ? ? final int retryCount,
? ? ? ? ? ? final boolean requestSentRetryEnabled,
? ? ? ? ? ? final Collection<Class<? extends IOException>> clazzes) {
? ? ? ? super();
? ? ? ? this.retryCount = retryCount;
? ? ? ? this.requestSentRetryEnabled = requestSentRetryEnabled;
? ? ? ? this.nonRetriableClasses = new HashSet<Class<? extends IOException>>();
? ? ? ? for (final Class<? extends IOException> clazz: clazzes) {
? ? ? ? ? ? this.nonRetriableClasses.add(clazz);
? ? ? ? }
? ? }
? ? /**
? ? ?* Create the request retry handler using the following list of
? ? ?* non-retriable IOException classes: <br>
? ? ?* <ul>
? ? ?* <li>InterruptedIOException</li>
? ? ?* <li>UnknownHostException</li>
? ? ?* <li>ConnectException</li>
? ? ?* <li>SSLException</li>
? ? ?* </ul>
? ? ?* @param retryCount how many times to retry; 0 means no retries
? ? ?* @param requestSentRetryEnabled true if it's OK to retry non-idempotent requests that have been sent
? ? ?*/
? ? @SuppressWarnings("unchecked")
? ? public DefaultHttpRequestRetryHandler(final int retryCount, final boolean requestSentRetryEnabled) {
? ? ? ? this(retryCount, requestSentRetryEnabled, Arrays.asList(
? ? ? ? ? ? ? ? InterruptedIOException.class,
? ? ? ? ? ? ? ? UnknownHostException.class,
? ? ? ? ? ? ? ? ConnectException.class,
? ? ? ? ? ? ? ? SSLException.class));
? ? }
? ? /**
? ? ?* Create the request retry handler with a retry count of 3, requestSentRetryEnabled false
? ? ?* and using the following list of non-retriable IOException classes: <br>
? ? ?* <ul>
? ? ?* <li>InterruptedIOException</li>
? ? ?* <li>UnknownHostException</li>
? ? ?* <li>ConnectException</li>
? ? ?* <li>SSLException</li>
? ? ?* </ul>
? ? ?*/
? ? public DefaultHttpRequestRetryHandler() {
? ? ? ? this(3, false);
? ? }
? ? /**
? ? ?* Used {@code retryCount} and {@code requestSentRetryEnabled} to determine
? ? ?* if the given method should be retried.
? ? ?*/
? ? @Override
? ? public boolean retryRequest(
? ? ? ? ? ? final IOException exception,
? ? ? ? ? ? final int executionCount,
? ? ? ? ? ? final HttpContext context) {
? ? ? ? Args.notNull(exception, "Exception parameter");
? ? ? ? Args.notNull(context, "HTTP context");
? ? ? ? if (executionCount > this.retryCount) {
? ? ? ? ? ? // Do not retry if over max retry count
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? if (this.nonRetriableClasses.contains(exception.getClass())) {
? ? ? ? ? ? return false;
? ? ? ? } else {
? ? ? ? ? ? for (final Class<? extends IOException> rejectException : this.nonRetriableClasses) {
? ? ? ? ? ? ? ? if (rejectException.isInstance(exception)) {
? ? ? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? final HttpClientContext clientContext = HttpClientContext.adapt(context);
? ? ? ? final HttpRequest request = clientContext.getRequest();
? ? ? ? if(requestIsAborted(request)){
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? if (handleAsIdempotent(request)) {
? ? ? ? ? ? // Retry if the request is considered idempotent
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? if (!clientContext.isRequestSent() || this.requestSentRetryEnabled) {
? ? ? ? ? ? // Retry if the request has not been sent fully or
? ? ? ? ? ? // if it's OK to retry methods that have been sent
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? // otherwise do not retry
? ? ? ? return false;
? ? }
? ? /**
? ? ?* @return {@code true} if this handler will retry methods that have
? ? ?* successfully sent their request, {@code false} otherwise
? ? ?*/
? ? public boolean isRequestSentRetryEnabled() {
? ? ? ? return requestSentRetryEnabled;
? ? }
? ? /**
? ? ?* @return the maximum number of times a method will be retried
? ? ?*/
? ? public int getRetryCount() {
? ? ? ? return retryCount;
? ? }
? ? /**
? ? ?* @since 4.2
? ? ?*/
? ? protected boolean handleAsIdempotent(final HttpRequest request) {
? ? ? ? return !(request instanceof HttpEntityEnclosingRequest);
? ? }
? ? /**
? ? ?* @since 4.2
? ? ?*
? ? ?* @deprecated (4.3)
? ? ?*/
? ? @Deprecated
? ? protected boolean requestIsAborted(final HttpRequest request) {
? ? ? ? HttpRequest req = request;
? ? ? ? if (request instanceof RequestWrapper) { // does not forward request to original
? ? ? ? ? ? req = ((RequestWrapper) request).getOriginal();
? ? ? ? }
? ? ? ? return (req instanceof HttpUriRequest && ((HttpUriRequest)req).isAborted());
? ? }
}

默認重試3次,三次都失敗則拋出NoHttpResponseException或其他異常

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • IDEA創(chuàng)建SpringBoot的maven項目的方法步驟

    IDEA創(chuàng)建SpringBoot的maven項目的方法步驟

    這篇文章主要介紹了IDEA創(chuàng)建SpringBoot的maven項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java中LinkedList和ArrayList的效率分析

    Java中LinkedList和ArrayList的效率分析

    本文主要介紹了Java中LinkedList和ArrayList的效率分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • mapper接口注入兩種方式詳解

    mapper接口注入兩種方式詳解

    這篇文章主要介紹了mapper接口注入兩種方式詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于MVC與SpringMVC的介紹、區(qū)別、執(zhí)行流程

    關(guān)于MVC與SpringMVC的介紹、區(qū)別、執(zhí)行流程

    這篇文章主要介紹了關(guān)于MVC與SpringMVC的介紹、區(qū)別、執(zhí)行流程,MVC框架的主要目標是將應(yīng)用程序的業(yè)務(wù)邏輯(Model)與用戶界面(View)分離開來,從而提高應(yīng)用程序的可維護性和可擴展性,需要的朋友可以參考下
    2023-05-05
  • SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng)

    SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng)

    WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。這是一種比較官方的說法,簡單點來說就是,在一次TCP連接中,通信的雙方可以相互通信。這篇文章主要介紹了SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng),需要的朋友可以參考下
    2019-10-10
  • java中vector與hashtable操作實例分享

    java中vector與hashtable操作實例分享

    java中vector與hashtable操作實例,有需要的朋友可以參考一下
    2014-01-01
  • MyBatis延遲加載與立即加載案例教程

    MyBatis延遲加載與立即加載案例教程

    這篇文章主要介紹了MyBatis延遲加載與立即加載案例教程,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 去掉IntelliJ IDEA 中 mybatis 對應(yīng)的 xml 文件警告的教程圖解

    去掉IntelliJ IDEA 中 mybatis 對應(yīng)的 xml 文件警告的教程圖解

    本文通過圖文并茂的形式給大家介紹了去掉IntelliJ IDEA 中 mybatis 對應(yīng)的 xml 文件警告的教程,需要的朋友可以參考下
    2018-06-06
  • Java設(shè)計模式之裝飾者模式詳解

    Java設(shè)計模式之裝飾者模式詳解

    這篇文章主要為大家詳細介紹了java設(shè)計模式之裝飾者模式,裝飾者模式是一種結(jié)構(gòu)式模式,感興趣的朋友可以參考一下
    2021-10-10
  • 多線程死鎖的產(chǎn)生以及如何避免死鎖方法(詳解)

    多線程死鎖的產(chǎn)生以及如何避免死鎖方法(詳解)

    下面小編就為大家?guī)硪黄嗑€程死鎖的產(chǎn)生以及如何避免死鎖方法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

泰来县| 平凉市| 广河县| 阳朔县| 鸡泽县| 漾濞| 东港市| 通化县| 安阳县| 乌什县| 长白| 江北区| 固安县| 宁海县| 离岛区| 平顶山市| 石嘴山市| 鄱阳县| 邢台县| 鹤岗市| 临西县| 眉山市| 淮阳县| 辽阳县| 政和县| 浑源县| 美姑县| 张家口市| 仪征市| 麦盖提县| 南乐县| 井冈山市| 阜康市| 金湖县| 托里县| 盘山县| 荥经县| 偏关县| 朝阳区| 肇庆市| 上饶市|