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

SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹

 更新時(shí)間:2022年12月12日 08:33:47   作者:幽默涵養(yǎng)miss u  
Ribbon是Netflix的組件之一,負(fù)責(zé)注冊(cè)中心的負(fù)載均衡,有助于控制HTTP和TCP客戶(hù)端行為。Spring Cloud Netflix Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載

一、介紹

Spring Cloud Ribbon是一個(gè)基于HTTP和TCP的客戶(hù)端負(fù)載均衡工具,它基于Netflix Ribbon實(shí)現(xiàn)。通過(guò)Spring Cloud的封裝,可以讓我們輕松地將面向服務(wù)的REST模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶(hù)端負(fù)載均衡的服務(wù)調(diào)用。Spring Cloud Ribbon雖然只是一個(gè)工具類(lèi)框架,它不像服務(wù)注冊(cè)中心、配置中心、API網(wǎng)關(guān)那樣需要獨(dú)立部署,但是它幾乎存在于每一個(gè)Spring Cloud構(gòu)建的微服務(wù)和基礎(chǔ)設(shè)施中。因?yàn)槲⒎?wù)間的調(diào)用,API網(wǎng)關(guān)的請(qǐng)求轉(zhuǎn)發(fā)等內(nèi)容,實(shí)際上都是通過(guò)Ribbon來(lái)實(shí)現(xiàn)的,包括后續(xù)我們將要學(xué)習(xí)的OpenFeign,它也是基于Ribbon實(shí)現(xiàn)負(fù)載均衡的遠(yuǎn)程服務(wù)調(diào)用工具。所以,對(duì)Spring Cloud Ribbon的理解和使用,對(duì)于我們使用Spring Cloud來(lái)構(gòu)建微服務(wù)非常重要.

二、使用

@Service
public class ApplicationClientServiceImpl implements ApplicationClientService {
    /**
     * Ribbon提供的負(fù)載均衡器
     */
    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @Override
    public String client() {
        ServiceInstance si = loadBalancerClient.choose("application-service");
        // 獲取Application Service IP。
        System.out.println(si.getHost());
        // 獲取Ip及端口。
        System.out.println(si.getInstanceId());
        // 端口 
        System.out.println(si.getPort());
        // 應(yīng)用程序名 application-service
        System.out.println(si.getServiceId());
        // URI http://Application Service IP:端口
        System.out.println(si.getUri().toString());
        return null;
    }
}

三、SpringWeb之RestTemplate基于Http協(xié)議的遠(yuǎn)程訪問(wèn)

要想使用RestRemplate必須自己配置

package com.bjsxt.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class MyConfig {
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(1)控制器

@RestController
public class ServerController {
    @Value("${server.port}")
    private int port;
    /**
     * 返回類(lèi)型為集合,泛型為自定類(lèi)型。
     */
    @RequestMapping("/returnUsers")
    public List<User> returnUsers(int nums){
        List<User> result = new ArrayList<>();
        for(int i = 0; i < nums; i++){
            result.add(new User(100 + i, "姓名-" + i, 20+i));
        }
        return result;
    }
    /**
     * 任意請(qǐng)求方式, 返回值類(lèi)型是集合。相對(duì)復(fù)雜的Java類(lèi)型。
     * @return
     */
    @RequestMapping("/returnList")
    public List<String> returnList(int nums){
        List<String> result = new ArrayList<>();
        for(int i = 0; i < nums; i++){
            result.add("返回結(jié)果 - " + i);
        }
        return result;
    }
    /**
     * 任意請(qǐng)求,傳遞路徑地址參數(shù)
     * @param name
     * @param age
     * @return
     */
    @RequestMapping("/restfulParams/{name}/{age}")
    public String restfulParams(@PathVariable("name") String name,
                                @PathVariable int age){
        System.out.println("端口號(hào): " + port + ", 任意請(qǐng)求方式,restful參數(shù), name = " +
                name + " ; age = " + age);
        return "restful參數(shù), name = " + name + " ; age = " + age;
    }
    /**
     * post請(qǐng)求,請(qǐng)求體傳遞參數(shù)。參數(shù)使用@RequestBody處理。
     */
    @PostMapping("/postBodyParams")
    public String postBodyParams(@RequestBody Map<String, String> params){
        System.out.println("端口號(hào): " + port + " , post請(qǐng)求,有請(qǐng)求體參數(shù), params = " +
                params);
        return "post請(qǐng)求,請(qǐng)求體參數(shù), params = " + params;
    }
    /**
     * post請(qǐng)求,有參數(shù)
     */
    @PostMapping("/postWithParams")
    public String postWithParams(String name, int age){
        System.out.println("端口號(hào): " + port + " , post請(qǐng)求,有參數(shù), name = " +
                name + " ; age = " + age);
        return "post請(qǐng)求有參數(shù) : name = " +
                name + " ; age = " + age;
    }
    /**
     * post請(qǐng)求,沒(méi)有參數(shù)
     */
    @PostMapping("/postNoParams")
    public String postNoParams(){
        System.out.println("端口號(hào): " + port + " , post請(qǐng)求,沒(méi)有參數(shù)");
        return "post請(qǐng)求,沒(méi)有參數(shù)";
    }
    /**
     * get請(qǐng)求,包含參數(shù)
     */
    @GetMapping("/getWithParams")
    public String getWithParams(String name, int age){
        System.out.println("端口號(hào): " + port + " 。 get請(qǐng)求,有參數(shù), name = "
                    + name + " ; age = " + age);
        return "get請(qǐng)求,包含參數(shù) : name = " + name + " ; age = " + age;
    }
    /**
     * get請(qǐng)求,沒(méi)有參數(shù)
     * @return
     */
    @GetMapping("/getNoParams")
    public String getNoParams(){
        System.out.println("端口號(hào):" + port + "。 get請(qǐng)求,無(wú)參數(shù)。");
        return "get請(qǐng)求,無(wú)參數(shù)。";
    }
}

(2)無(wú)參數(shù)GET請(qǐng)求-getForObject

    /**
     * 發(fā)get請(qǐng)求。
     * 沒(méi)有請(qǐng)求參數(shù)
     *
     * <T> T getForObject(String url, Class<T> returnValueType, Object... params)
     * url - 要訪問(wèn)的具體地址
     * returnValueType - 服務(wù)器返回的響應(yīng)體數(shù)據(jù)類(lèi)型
     * params - 可選的請(qǐng)求參數(shù)
     * return - 響應(yīng)體中的具體內(nèi)容。
     */
    @Test
    public void testGetNoParams(){
        // 定義要訪問(wèn)的地址是什么
        String url = baseUrl + "/getNoParams";
        // 發(fā)get請(qǐng)求。沒(méi)有參數(shù)
        String result = restTemplate.getForObject(url, String.class);
        System.out.println("服務(wù)器返回:" + result);
    }

(3)有參數(shù)GET請(qǐng)求-getForObject

    /**
     * get請(qǐng)求,有參數(shù)
     * <T> T getForObject(String url, Class<T> returnValueType, Object... params)
     * <T> T getForObject(String url, Class<T> returnValueType, Map params)
     * 傳遞參數(shù),就是處理請(qǐng)求地址url,并傳遞需要的參數(shù)。
     * 要傳遞參數(shù),則處理請(qǐng)求地址url。使用{名字}作為占位變量。傳遞參數(shù)的時(shí)候,
     * 可以根據(jù)占位變量從左至右的順序,使用可變長(zhǎng)數(shù)組依次傳遞。
     * 也可以根據(jù)占位變量名稱(chēng),做指定傳遞,使用map集合傳遞,map的key就是占位變量名,
     * map的value,是要傳遞的請(qǐng)求參數(shù)。
     */
    @Test
    public void testGetWithParams(){
        String url = baseUrl + "/getWithParams?name={x}&age={y}";
        String result1 =
                restTemplate.getForObject(url, String.class,
                        "張三", "20");
        System.out.println("可變長(zhǎng)數(shù)組傳遞參數(shù),服務(wù)器返回:" + result1);
        System.out.println("==========================================");
        Map<String, Object> params = new HashMap<>();
        params.put("x", "李四");
        params.put("y", 25);
        String result2 =
                restTemplate.getForObject(url, String.class, params);
        System.out.println("Map集合傳遞參數(shù),服務(wù)器返回:" + result2);
    }

(4)GET請(qǐng)求-getForEntity

    /**
     * 在RestTemplate中。除方法getForObject以外,還有g(shù)etForEntity。
     *  方法除返回值類(lèi)型,其他一致。
     * <T> ResponseEntity<T> getForEntity(String url, Class<T> returnValueType,
     *       Object... params)
     * ResponseEntity - 包含響應(yīng)頭和響應(yīng)體。
     * 如果需要對(duì)響應(yīng)頭做特殊處理,使用getForEntity方法。
     */
    @Test
    public void testGetForEntity(){
        String url = baseUrl + "/getNoParams";
        ResponseEntity<String> entity =
                restTemplate.getForEntity(url, String.class);
        HttpHeaders headers = entity.getHeaders();
        for(String headerName : headers.keySet()){
            System.out.println("響應(yīng)頭: " + headerName + " = "
                    + headers.get(headerName));
        }
        System.out.println("響應(yīng)狀態(tài)碼: " + entity.getStatusCodeValue());
        System.out.println("響應(yīng)體數(shù)據(jù): " + entity.getBody());
    }

(5)無(wú)參數(shù)POST請(qǐng)求

    /**
     * post請(qǐng)求,沒(méi)有參數(shù)
     * <T> T postForObject(String url, Object body, Class<T> returnBodyType,
     *            Object... params);
     * <T> T postForObject(String url, Object body, Class<T> returnBodyType,
     *            Map params);
     * body參數(shù) - 使用post請(qǐng)求方式發(fā)請(qǐng)求的時(shí)候,請(qǐng)求體是什么?
     *   建議傳遞的對(duì)象類(lèi)型是HttpEntity。
     *   如果對(duì)請(qǐng)求體沒(méi)有要求,可以傳遞null。
     */
    @Test
    public void testPostNoParams(){
        String url = baseUrl + "/postNoParams";
        String result =
                restTemplate.postForObject(url, null, String.class);
        System.out.println("post請(qǐng)求,無(wú)參數(shù),服務(wù)器返回:" + result);
    }

(6)post請(qǐng)求路徑地址傳遞參數(shù)

    /**
     * post請(qǐng)求,有參數(shù)
     * 1. 請(qǐng)求地址傳遞參數(shù)。 請(qǐng)求頭傳參。 傳參方式和get一樣。
     * 2. 請(qǐng)求體表單參數(shù)。 請(qǐng)求體傳參。 需要提供請(qǐng)求體數(shù)據(jù)
     */
    @Test
    public void testPostWithParamsPath(){
        String url = baseUrl + "/postWithParams?name={1}&age={2}";
        String result =
                restTemplate.postForObject(url, null, String.class,
                        "王五", 30);
        System.out.println(result);
    }

(7)post請(qǐng)求表單傳遞參數(shù)

    /**
     * spring web在處理請(qǐng)求頭和請(qǐng)求體的時(shí)候,
     * 需要HttpMessageConverter提供數(shù)據(jù)轉(zhuǎn)換處理。
     * HttpMessageConverter是接口,由Spring WEB定義。
     * 具體實(shí)現(xiàn),需要依賴(lài)不同的具體技術(shù)實(shí)現(xiàn)。
     * 一般都使用jackson做實(shí)現(xiàn)。請(qǐng)求頭和體數(shù)據(jù),都是基于JSON轉(zhuǎn)換的。
     */
    @Test
    public void testPostWithParamsForm(){
        String url = baseUrl + "/postWithParams";
        // 創(chuàng)建請(qǐng)求體信息。
        // 請(qǐng)求頭, 表單請(qǐng)求。  application/x-www-form-urlencoded
        HttpHeaders headers = new HttpHeaders();
        headers.add("content-type", "application/x-www-form-urlencoded");
        // 表單
        MultiValueMap<String, Object> form =
                new LinkedMultiValueMap<>();
        // add 提供一個(gè) 請(qǐng)求參數(shù) 名 = 值。
        form.add("name", "尼古拉斯.趙四");
        form.add("age", 40);
        // put 提供 鍵值對(duì)
        //form.put("name", Arrays.asList("尼古拉斯.趙四"));
        //List<Object> ages = new ArrayList<>();
        //ages.add(40);
        //form.put("age", ages);
        HttpEntity<MultiValueMap<String, Object>> entity = new HttpEntity<>(form, headers);
        String result =
                restTemplate.postForObject(url, entity, String.class);
        System.out.println(result);
    }

(8)post請(qǐng)求請(qǐng)求體傳遞參數(shù)

    /**
     * post請(qǐng)求,有參數(shù)
     * 使用請(qǐng)求體傳遞參數(shù)。@RequestBody處理請(qǐng)求參數(shù)。
     *  1. 請(qǐng)求參數(shù)只能在請(qǐng)求體中,以字符串描述,且是一個(gè)完整的請(qǐng)求參數(shù)。此參數(shù)沒(méi)有名稱(chēng)。如:JSON
     *  2. 請(qǐng)求頭 content-type的設(shè)置,和具體的參數(shù)值的格式相關(guān),如: JSON對(duì)應(yīng)的content-type是application/json
     *     如:xml字符串對(duì)應(yīng)的content-type是application/xml
     *  3. 請(qǐng)求體傳遞的參數(shù),只能由唯一的一個(gè)完整參數(shù)??梢酝瑫r(shí)攜帶表單參數(shù)和地址欄參數(shù)。
     */
    @Test
    public void testPostBodyParams(){
        String url = baseUrl + "/postBodyParams";
        // 創(chuàng)建請(qǐng)求參數(shù), 使用JSON格式的字符串,描述一個(gè)Map集合。
        String params = "{\"key1\":\"value1\", \"key2\":\"value2\"}";
        // 創(chuàng)建請(qǐng)求時(shí),使用的請(qǐng)求體描述
        HttpHeaders headers = new HttpHeaders();
        headers.add("content-type", "application/json;charset=utf-8");
        HttpEntity<String> entity = new HttpEntity<>(params, headers);
        String result = restTemplate.postForObject(url, entity, String.class);
        System.out.println("返回結(jié)果:" + result);
    }
    @Test
    public void testPostBodyParams2(){
        // 可以使用簡(jiǎn)單的處理方案,實(shí)現(xiàn)請(qǐng)求體傳遞JSON格式的數(shù)據(jù)
        // 使用postForObject(),第二個(gè)參數(shù),直接傳遞一個(gè)Java對(duì)象,作為請(qǐng)求體中傳遞的參數(shù)。
        // 參數(shù)沒(méi)有名字,由RestTemplate做數(shù)據(jù)轉(zhuǎn)換,默認(rèn)使用JSON格式字符串做轉(zhuǎn)換結(jié)果。
        String url = baseUrl + "/postBodyParams";
        // 創(chuàng)建Map類(lèi)型的參數(shù)對(duì)象
        Map<String, String> params = new HashMap<>();
        params.put("name", "測(cè)試");
        params.put("gender", "男");
        // 請(qǐng)求服務(wù)器。 直接傳遞java對(duì)象,默認(rèn)請(qǐng)求頭content-type=application/json;charset=utf-8
        String result = restTemplate.postForObject(url, params, String.class);
        System.out.println("返回結(jié)果:" + result);
    }

(9)RestFUL傳遞參數(shù)

    /**
     * 使用get請(qǐng)求方式,傳遞restful參數(shù)
     */
    @Test
    public void testRestfulParams(){
        String url = baseUrl + "/restfulParams/{name}/{age}";
        // 訪問(wèn)
        String result = restTemplate.getForObject(url, String.class, "restful", "15");
        System.out.println(result);
    }

(10)Exchange通用處理方案(處理相對(duì)復(fù)雜的結(jié)果類(lèi)型例如自定義類(lèi)型數(shù)組)

    /**
     * RestTemplate類(lèi)型中的通用方法,exchange??梢蕴峤蝗我夥绞降恼?qǐng)求。
     * 且可以定義相對(duì)復(fù)雜的返回類(lèi)型。如:帶有泛型要求的集合。
     *
     * <T> ResponseEntity<T> exchange(String url, HttpMethod requestMethod, HttpEntity http,
     *                                Class<T> returnType, Object... params)
     * <T> ResponseEntity<T> exchange(String url, HttpMethod requestMethod, HttpEntity http,
     *                                Class<T> returnType, Map params)
     * <T> ResponseEntity<T> exchange(String url, HttpMethod requestMethod, HttpEntity http,
     *                                ParameterizedTypeReference<T> returnType, Object... params)
     * <T> ResponseEntity<T> exchange(String url, HttpMethod requestMethod, HttpEntity http,
     *                                ParameterizedTypeReference<T> returnType, Map... params)
     */
    @Test
    public void testExchangeMethod(){
        String url = baseUrl + "/returnList?nums={1}";
        // 相對(duì)復(fù)雜的返回結(jié)果類(lèi)型描述對(duì)象
        url = baseUrl + "/returnUsers?nums={1}";
        ParameterizedTypeReference<List<User>> type =
                new ParameterizedTypeReference<List<User>>() {};
        // 訪問(wèn)遠(yuǎn)程
        ResponseEntity<List<User>> entity =
                restTemplate.exchange(url, HttpMethod.GET, null, type, 3);
        List<User> body = entity.getBody();
        System.out.println(body);
    }

四、調(diào)用Application Service集群

基于RestTemplate和Ribbon實(shí)現(xiàn)Application Client調(diào)用Application Service集群

(1)編寫(xiě)配置類(lèi)

@Configuration
public class AppClientConfiguration {
    /**
     * 創(chuàng)建RestTemplate對(duì)象的方法,增加注解
     * LoadBalanced - 把Spring Cloud封裝的LoadBalancerClient于RestTemplate整合。
     * 讓RestTemplate自帶負(fù)載均衡能力。僅在當(dāng)前的Ribbon環(huán)境中生效。
     * 邏輯是:
     *  請(qǐng)求  http://服務(wù)名稱(chēng)/具體地址.  RestTemplate解析請(qǐng)求地址。
     *  把服務(wù)名稱(chēng)解析出,作為參數(shù),調(diào)用LoadBalancerClient中的choose方法。
     *  把返回的ServiceInstance.getUri().toASCIIString()作為服務(wù)器地址,拼接上
     *  請(qǐng)求的具體地址。訪問(wèn)遠(yuǎn)程。
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

(2)發(fā)起遠(yuǎn)程調(diào)用

@Service
public class ApplicationClientServiceImpl implements ApplicationClientService {
    @Autowired
    private RestTemplate restTemplate;
    //http://服務(wù)名
    private final String baseUrl = "http://eureka-client-app-service";
    @Override
    public String getNoParams() {
        String url = baseUrl + "/getNoParams";
        // 訪問(wèn)
        String result = restTemplate.getForObject(url, String.class);
        System.out.println(result);
        return result;
    }
}

五、Ribbon負(fù)載均衡算法

Ribbon的負(fù)載均衡策略是通過(guò)不同的類(lèi)型來(lái)實(shí)現(xiàn)的(都是IRule接口的實(shí)現(xiàn)),下表詳細(xì)介紹一些常用負(fù)載均衡策略及對(duì)應(yīng)的Ribbon策略類(lèi)。

編號(hào)策略名稱(chēng)策略對(duì)應(yīng)的類(lèi)名實(shí)現(xiàn)原理
1輪詢(xún)策略(默認(rèn))RoundRobinRule輪詢(xún)策略表示每次都按照順序取下一個(gè)application service,比如一共有5個(gè)application service,第1次取第1個(gè),第2次取第2個(gè),第3次取第3個(gè),以此類(lèi)推
2權(quán)重輪詢(xún)策略(常用,中小型項(xiàng)目使用)WeightedResponseTimeRule1.根據(jù)每個(gè)application service的響應(yīng)時(shí)間分配一個(gè)權(quán)重,響應(yīng)時(shí)間越長(zhǎng),權(quán)重越小,被選中的可能性越低。 2.原理:一開(kāi)始為輪詢(xún)策略,并開(kāi)啟一個(gè)計(jì)時(shí)器,每30秒收集一次每個(gè)application service的平均響應(yīng)時(shí)間,當(dāng)信息足夠時(shí),給每個(gè)application service附上一個(gè)權(quán)重,并按權(quán)重隨機(jī)選擇application service,權(quán)重越高的application service會(huì)被高概率選中。
3隨機(jī)策略(不推薦,測(cè)試使用,開(kāi)發(fā)使用)RandomRule從application service列表中隨機(jī)選擇一個(gè)
4最少并發(fā)數(shù)策略(應(yīng)用在硬件軟件環(huán)境一致的情況下,中小型項(xiàng)目使用)BestAvailableRule選擇正在請(qǐng)求中的并發(fā)數(shù)最小的application service,除非這個(gè)application service在熔斷中。
5重試策略。在“選定的負(fù)載均衡策略”基礎(chǔ)上進(jìn)行重試機(jī)制RetryRule1.“選定的負(fù)載均衡策略”這個(gè)策略是輪詢(xún)策略RoundRobinRule 2.該重試策略先設(shè)定一個(gè)閾值時(shí)間段,如果在這個(gè)閾值時(shí)間段內(nèi)當(dāng)選擇application service不成功,則一直嘗試采用“選定的負(fù)載均衡策略:輪詢(xún)策略”最后選擇一個(gè)可用的application service
6可用性敏感策略(一般在同區(qū)域內(nèi)服務(wù)集群環(huán)境中使用)AvailabilityFilteringRule過(guò)濾性能差的application service,有2種: 第一種:過(guò)濾掉在eureka中處于一直連接失敗application service 第二種:過(guò)濾掉高并發(fā)的application service
7區(qū)域敏感性策略(應(yīng)用在大型的,物理隔離分布式環(huán)境中)ZoneAvoidanceRule1.以一個(gè)區(qū)域?yàn)閱挝豢疾炜捎眯裕瑢?duì)于不可用的區(qū)域整個(gè)丟棄,從剩下區(qū)域中選可用的application service 2.如果這個(gè)ip區(qū)域內(nèi)有一個(gè)或多個(gè)實(shí)例不可達(dá)或響應(yīng)變慢,都會(huì)降低該ip區(qū)域內(nèi)其他ip被選中的權(quán)重。

指定負(fù)載均衡策略,新增Bean對(duì)象管理方法

    @Bean
    public IRule iRule(){
        return new RandomRule();
    }

到此這篇關(guān)于SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹的文章就介紹到這了,更多相關(guān)SpringCloud Netfilx Ribbon內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入聊聊Java內(nèi)存泄露問(wèn)題

    深入聊聊Java內(nèi)存泄露問(wèn)題

    所謂內(nèi)存泄露就是指一個(gè)不再被程序使用的對(duì)象或變量一直被占據(jù)在內(nèi)存中,下面這篇文章主要給大家介紹了關(guān)于Java內(nèi)存泄露問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • java的arrays數(shù)組排序示例分享

    java的arrays數(shù)組排序示例分享

    排序算法,基本的高級(jí)語(yǔ)言都有一些提供。C語(yǔ)言有qsort()函數(shù),C++有sort()函數(shù),java語(yǔ)言有Arrays類(lèi)(不是Array)。用這些排序時(shí),都可以寫(xiě)自己的排序規(guī)則
    2014-02-02
  • Java線程之間通信的幾種方式詳解

    Java線程之間通信的幾種方式詳解

    在 Java 中,線程之間的通信是通過(guò)共享內(nèi)存模型來(lái)實(shí)現(xiàn)的,線程通過(guò)共享的對(duì)象和變量來(lái)交換數(shù)據(jù),為了確保線程間通信的正確性,Java 提供了一系列機(jī)制來(lái)實(shí)現(xiàn)線程安全、同步和通信,以下是常用的幾種線程間通信的方式,以及它們的使用方法和場(chǎng)景,需要的朋友可以參考下
    2025-03-03
  • HashMap鏈表與紅黑樹(shù)轉(zhuǎn)換詳解

    HashMap鏈表與紅黑樹(shù)轉(zhuǎn)換詳解

    這篇文章主要介紹了HashMap鏈表與紅黑樹(shù)轉(zhuǎn)換詳解,HashMap是Java中的一種數(shù)據(jù)結(jié)構(gòu),它實(shí)現(xiàn)了Map接口,提供了鍵值對(duì)的存儲(chǔ)和檢索功能,它基于哈希表的原理,通過(guò)將鍵映射到哈希表中的位置來(lái)存儲(chǔ)和獲取值,從而實(shí)現(xiàn)了快速的查找和插入操作,需要的朋友可以參考下
    2023-11-11
  • 如何使用java代碼獲取JVM信息

    如何使用java代碼獲取JVM信息

    這篇文章主要介紹了使用java代碼獲取JVM信息的相關(guān)操作代碼,代碼簡(jiǎn)單易懂,感興趣的朋友一起看看吧
    2025-04-04
  • JavaWeb項(xiàng)目打開(kāi)網(wǎng)頁(yè)出現(xiàn)Session Error的異常解決方案

    JavaWeb項(xiàng)目打開(kāi)網(wǎng)頁(yè)出現(xiàn)Session Error的異常解決方案

    這篇文章主要介紹了JavaWeb項(xiàng)目打開(kāi)網(wǎng)頁(yè)出現(xiàn)Session Error的異常解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • mybatis-plus 通用字段自動(dòng)化(如邏輯刪除和更新時(shí)間等)

    mybatis-plus 通用字段自動(dòng)化(如邏輯刪除和更新時(shí)間等)

    這篇文章主要介紹了mybatis-plus 通用字段自動(dòng)化(如邏輯刪除和更新時(shí)間等),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Springmvc自定義類(lèi)型轉(zhuǎn)換器實(shí)現(xiàn)步驟

    Springmvc自定義類(lèi)型轉(zhuǎn)換器實(shí)現(xiàn)步驟

    這篇文章主要介紹了Springmvc自定義類(lèi)型轉(zhuǎn)換器實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Spring Bean的生命周期詳細(xì)介紹

    Spring Bean的生命周期詳細(xì)介紹

    這篇文章主要介紹了Spring Bean的生命周期的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • 淺談java中Math.random()與java.util.random()的區(qū)別

    淺談java中Math.random()與java.util.random()的區(qū)別

    下面小編就為大家?guī)?lái)一篇淺談java中Math.random()與java.util.random()的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09

最新評(píng)論

宝应县| 黑山县| 怀远县| 长岛县| 荃湾区| 衡山县| 扎赉特旗| 铜陵市| 新建县| 忻城县| 繁峙县| 天津市| 诏安县| 淮阳县| 苍山县| 惠安县| 三明市| 广丰县| 肃宁县| 安岳县| 错那县| 巩义市| 迁安市| 奉新县| 侯马市| 偃师市| 肃北| 嘉义市| 龙里县| 昆明市| 上杭县| 昌都县| 仁布县| 铅山县| 中卫市| 临海市| 车致| 东莞市| 莱州市| 吴桥县| 惠东县|