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

Java Condition類(lèi)案例詳解

 更新時(shí)間:2021年09月01日 11:27:39   作者:南 墻  
這篇文章主要介紹了Java Condition類(lèi)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

一 condition 介紹及demo

 Condition是在java 1.5中才出現(xiàn)的,它用來(lái)替代傳統(tǒng)的Object的wait()、notify()實(shí)現(xiàn)線(xiàn)程間的協(xié)作,相比使用Object的wait()、notify(),使用Condition的await()、signal()這種方式實(shí)現(xiàn)線(xiàn)程間協(xié)作更加安全和高效。因此通常來(lái)說(shuō)比較推薦使用Condition,阻塞隊(duì)列實(shí)際上是使用了Condition來(lái)模擬線(xiàn)程間協(xié)作。

Condition是個(gè)接口,基本的方法就是await()和signal()方法;
Condition依賴(lài)于Lock接口,生成一個(gè)Condition的基本代碼是lock.newCondition()
調(diào)用Condition的await()和signal()方法,都必須在lock保護(hù)之內(nèi),就是說(shuō)必須在lock.lock()和lock.unlock之間才可以使用
Conditon中的await()對(duì)應(yīng)Object的wait();

Condition中的signal()對(duì)應(yīng)Object的notify();

Condition中的signalAll()對(duì)應(yīng)Object的notifyAll()。

在這里插入圖片描述

condition常見(jiàn)例子arrayblockingqueue。下面是demo:

package thread;
 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * 
 * @author zhangliang
 *
 * 2016年4月8日 下午5:48:54
 */
public class ConTest {
	
	 final Lock lock = new ReentrantLock();
	 final Condition condition = lock.newCondition();
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ConTest test = new ConTest();
	    Producer producer = test.new Producer();
	    Consumer consumer = test.new Consumer();
	          
	    
	    consumer.start(); 
	    producer.start();
	}
	
	 class Consumer extends Thread{
         
	        @Override
	        public void run() {
	            consume();
	        }
	          
	        private void consume() {
	           	             
	                try {
	                	   lock.lock();
	                    System.out.println("我在等一個(gè)新信號(hào)"+this.currentThread().getName());
	                    condition.await();
	                    
	                } catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} finally{
						System.out.println("拿到一個(gè)信號(hào)"+this.currentThread().getName());
	                    lock.unlock();
	                }
	            
	        }
	    }
	 
	 class Producer extends Thread{
         
	        @Override
	        public void run() {
	            produce();
	        }
	          
	        private void produce() {	             
	                try {
	                	   lock.lock();
	                       System.out.println("我拿到鎖"+this.currentThread().getName());
	                        condition.signalAll();	                         
	                    System.out.println("我發(fā)出了一個(gè)信號(hào):"+this.currentThread().getName());
	                } finally{
	                    lock.unlock();
	                }
	            }
	 }
	    
}

運(yùn)行結(jié)果:

在這里插入圖片描述

Condition的執(zhí)行方式,是當(dāng)在線(xiàn)程Consumer中調(diào)用await方法后,線(xiàn)程Consumer將釋放鎖,并且將自己沉睡,等待喚醒,線(xiàn)程Producer獲取到鎖后,開(kāi)始做事,完畢后,調(diào)用Condition的signalall方法,喚醒線(xiàn)程Consumer,線(xiàn)程Consumer恢復(fù)執(zhí)行。

以上說(shuō)明Condition是一個(gè)多線(xiàn)程間協(xié)調(diào)通信的工具類(lèi),使得某個(gè),或者某些線(xiàn)程一起等待某個(gè)條件(Condition),只有當(dāng)該條件具備( signal 或者 signalAll方法被帶調(diào)用)時(shí) ,這些等待線(xiàn)程才會(huì)被喚醒,從而重新?tīng)?zhēng)奪鎖。

Condition實(shí)現(xiàn)生產(chǎn)者、消費(fèi)者模式:

package thread;
 
import java.util.PriorityQueue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class ConTest2 {
	    private int queueSize = 10;
	    private PriorityQueue<Integer> queue = new PriorityQueue<Integer>(queueSize);
	    private Lock lock = new ReentrantLock();
	    private Condition notFull = lock.newCondition();
	    private Condition notEmpty = lock.newCondition();
	     
	    public static void main(String[] args) throws InterruptedException  {
	    	ConTest2 test = new ConTest2();
	        Producer producer = test.new Producer();
	        Consumer consumer = test.new Consumer();	          
	        producer.start();
	        consumer.start();
	        Thread.sleep(0);
	        producer.interrupt();
	        consumer.interrupt();
	    }
	      
	    class Consumer extends Thread{	          
	        @Override
	        public void run() {
	            consume();
	        }
	        volatile boolean flag=true;  
	        private void consume() {
	            while(flag){
	                lock.lock();
	                try {
	                    while(queue.isEmpty()){
	                        try {
	                            System.out.println("隊(duì)列空,等待數(shù)據(jù)");
	                            notEmpty.await();
	                        } catch (InterruptedException e) {	                          
	                            flag =false;
	                        }
	                    }
	                    queue.poll();                //每次移走隊(duì)首元素
	                    notFull.signal();
	                    System.out.println("從隊(duì)列取走一個(gè)元素,隊(duì)列剩余"+queue.size()+"個(gè)元素");
	                } finally{
	                    lock.unlock();
	                }
	            }
	        }
	    }
	      
	    class Producer extends Thread{	          
	        @Override
	        public void run() {
	            produce();
	        }
	        volatile boolean flag=true;  
	        private void produce() {
	            while(flag){
	                lock.lock();
	                try {
	                    while(queue.size() == queueSize){
	                        try {
	                            System.out.println("隊(duì)列滿(mǎn),等待有空余空間");
	                            notFull.await();
	                        } catch (InterruptedException e) {
	                            
	                            flag =false;
	                        }
	                    }
	                    queue.offer(1);        //每次插入一個(gè)元素
	                    notEmpty.signal();
	                    System.out.println("向隊(duì)列取中插入一個(gè)元素,隊(duì)列剩余空間:"+(queueSize-queue.size()));
	                } finally{
	                    lock.unlock();
	                }
	            }
	        }
	    }
	}

運(yùn)行結(jié)果:

在這里插入圖片描述

二 Condition接口

condition可以通俗的理解為條件隊(duì)列。當(dāng)一個(gè)線(xiàn)程在調(diào)用了await方法以后,直到線(xiàn)程等待的某個(gè)條件為真的時(shí)候才會(huì)被喚醒。這種方式為線(xiàn)程提供了更加簡(jiǎn)單的等待/通知模式。Condition必須要配合鎖一起使用,因?yàn)閷?duì)共享狀態(tài)變量的訪(fǎng)問(wèn)發(fā)生在多線(xiàn)程環(huán)境下。一個(gè)Condition的實(shí)例必須與一個(gè)Lock綁定,因此Condition一般都是作為L(zhǎng)ock的內(nèi)部實(shí)現(xiàn)。

await() :造成當(dāng)前線(xiàn)程在接到信號(hào)或被中斷之前一直處于等待狀態(tài)。
await(long time, TimeUnit unit) :造成當(dāng)前線(xiàn)程在接到信號(hào)、被中斷或到達(dá)指定等待時(shí)間之前一直處于等待狀態(tài)
awaitNanos(long nanosTimeout) :造成當(dāng)前線(xiàn)程在接到信號(hào)、被中斷或到達(dá)指定等待時(shí)間之前一直處于等待狀態(tài)。返回值表示剩余時(shí)間,如果在nanosTimesout之前喚醒,那么返回值 = nanosTimeout - 消耗時(shí)間,如果返回值 <= 0 ,則可以認(rèn)定它已經(jīng)超時(shí)了。

awaitUninterruptibly() :造成當(dāng)前線(xiàn)程在接到信號(hào)之前一直處于等待狀態(tài)。【注意:該方法對(duì)中斷不敏感】。
awaitUntil(Date deadline) :造成當(dāng)前線(xiàn)程在接到信號(hào)、被中斷或到達(dá)指定最后期限之前一直處于等待狀態(tài)。如果沒(méi)有到指定時(shí)間就被通知,則返回true,否則表示到了指定時(shí)間,返回返回false。
signal() :?jiǎn)拘岩粋€(gè)等待線(xiàn)程。該線(xiàn)程從等待方法返回前必須獲得與Condition相關(guān)的鎖。
signal()All :?jiǎn)拘阉械却€(xiàn)程。能夠從等待方法返回的線(xiàn)程必須獲得與Condition相關(guān)的鎖。

三 condition實(shí)現(xiàn)分析:

在這里插入圖片描述

Condition接口包含了多種await方式和兩個(gè)通知方法
ConditionObject實(shí)現(xiàn)了Condition接口,是AbstractQueuedSynchronizer的內(nèi)部類(lèi)(因?yàn)镃ondition的操作都需要獲取想關(guān)聯(lián)的鎖)
Reentrantlock的newCondition方法返回與某個(gè)lock實(shí)例相關(guān)的Condition對(duì)象

public abstract class AbstractQueuedLongSynchronizer
    extends AbstractOwnableSynchronizer
    implements java.io.Serializable {

結(jié)合上面的類(lèi)圖,我們看到condition實(shí)現(xiàn)是依賴(lài)于aqs,而aqs是個(gè)抽象類(lèi)。里面定義了同步器的基本框架,實(shí)現(xiàn)了基本的結(jié)構(gòu)功能。只留有狀態(tài)條件的維護(hù)由具體同步器根據(jù)具體場(chǎng)景來(lái)定制,如常見(jiàn)的 ReentrantLock 、 RetrantReadWriteLock和CountDownLatch 等等,

3.1 等待隊(duì)列

Condition是AQS的內(nèi)部類(lèi)。每個(gè)Condition對(duì)象都包含一個(gè)隊(duì)列(等待隊(duì)列)。等待隊(duì)列是一個(gè)FIFO的隊(duì)列,在隊(duì)列中的每個(gè)節(jié)點(diǎn)都包含了一個(gè)線(xiàn)程引用,該線(xiàn)程就是在Condition對(duì)象上等待的線(xiàn)程,如果一個(gè)線(xiàn)程調(diào)用了Condition.await()方法,那么該線(xiàn)程將會(huì)釋放鎖、構(gòu)造成節(jié)點(diǎn)加入等待隊(duì)列并進(jìn)入等待狀態(tài)。AQS有一個(gè)同步隊(duì)列和多個(gè)等待隊(duì)列,節(jié)點(diǎn)都是Node。等待隊(duì)列的基本結(jié)構(gòu)如下所示。

在這里插入圖片描述

等待分為首節(jié)點(diǎn)和尾節(jié)點(diǎn)。當(dāng)一個(gè)線(xiàn)程調(diào)用Condition.await()方法,將會(huì)以當(dāng)前線(xiàn)程構(gòu)造節(jié)點(diǎn),并將節(jié)點(diǎn)從尾部加入等待隊(duì)列。新增節(jié)點(diǎn)就是將尾部節(jié)點(diǎn)指向新增的節(jié)點(diǎn)。節(jié)點(diǎn)引用更新本來(lái)就是在獲取鎖以后的操作,所以不需要CAS保證。同時(shí)也是線(xiàn)程安全的操作。

public class ConditionObject implements Condition, java.io.Serializable {
    private static final long serialVersionUID = 1173984872572414699L;
    /** First node of condition queue. */
    private transient Node firstWaiter;
    /** Last node of condition queue. */
    private transient Node lastWaiter;

3.2 等待

當(dāng)線(xiàn)程調(diào)用了Condition的await()方法以后。線(xiàn)程就作為隊(duì)列中的一個(gè)節(jié)點(diǎn)被加入到等待隊(duì)列中去了。同時(shí)會(huì)釋放鎖的擁有。當(dāng)從await方法返回的時(shí)候。當(dāng)前線(xiàn)程一定會(huì)獲取condition相關(guān)聯(lián)的鎖。

如果從隊(duì)列(同步隊(duì)列和等待隊(duì)列)的角度去看await()方法,當(dāng)調(diào)用await()方法時(shí),相當(dāng)于同步隊(duì)列的首節(jié)點(diǎn)(獲取鎖的節(jié)點(diǎn))移動(dòng)到Condition的等待隊(duì)列中。

調(diào)用該方法的線(xiàn)程成功的獲取鎖的線(xiàn)程,也就是同步隊(duì)列的首節(jié)點(diǎn),該方法會(huì)將當(dāng)前線(xiàn)程構(gòu)造成節(jié)點(diǎn)并加入到等待隊(duì)列中,然后釋放同步狀態(tài),喚醒同步隊(duì)列中的后繼節(jié)點(diǎn),然后當(dāng)前線(xiàn)程會(huì)進(jìn)入等待狀態(tài)。

當(dāng)?shù)却?duì)列中的節(jié)點(diǎn)被喚醒的時(shí)候,則喚醒節(jié)點(diǎn)的線(xiàn)程開(kāi)始嘗試獲取同步狀態(tài)。如果不是通過(guò) 其他線(xiàn)程調(diào)用Condition.signal()方法喚醒,而是對(duì)等待線(xiàn)程進(jìn)行中斷,則會(huì)拋出InterruptedException異常信息。

在這里插入圖片描述

我們看一下這個(gè)await的方法,它是AQS的方法,

public final void await() throws InterruptedException {
	if (Thread.interrupted())
throw new InterruptedException();
Node node = addConditionWaiter(); //將當(dāng)前線(xiàn)程包裝下后,
//添加到Condition自己維護(hù)的一個(gè)鏈表中。
int savedState = fullyRelease(node);//釋放當(dāng)前線(xiàn)程占有的鎖,從demo中看到,
//調(diào)用await前,當(dāng)前線(xiàn)程是占有鎖的

int interruptMode = 0;
	 while (!isOnSyncQueue(node)) {//釋放完畢后,遍歷AQS的隊(duì)列,看當(dāng)前節(jié)點(diǎn)是否在隊(duì)列中,
//不在 說(shuō)明它還沒(méi)有競(jìng)爭(zhēng)鎖的資格,所以繼續(xù)將自己沉睡。
//直到它被加入到隊(duì)列中,聰明的你可能猜到了,
//沒(méi)有錯(cuò),在singal的時(shí)候加入不就可以了?
LockSupport.park(this);
if ((interruptMode = checkInterruptWhileWaiting(node)) != 0)
break;
}
//被喚醒后,重新開(kāi)始正式競(jìng)爭(zhēng)鎖,同樣,如果競(jìng)爭(zhēng)不到還是會(huì)將自己沉睡,等待喚醒重新開(kāi)始競(jìng)爭(zhēng)。
if (acquireQueued(node, savedState) && interruptMode != THROW_IE)
interruptMode = REINTERRUPT;
if (node.nextWaiter != null)
unlinkCancelledWaiters();
if (interruptMode != 0)
reportInterruptAfterWait(interruptMode);
}

結(jié)合代碼去看,同步隊(duì)列的首節(jié)點(diǎn) 并不會(huì)直接加入等待隊(duì)列,而是通過(guò)addConditionWaiter把當(dāng)前線(xiàn)程構(gòu)造成一個(gè)新節(jié)點(diǎn)并加入到等待隊(duì)列中。

/**
         * Adds a new waiter to wait queue.
         * @return its new wait node
         */
        private Node addConditionWaiter() {
            Node t = lastWaiter;
            // If lastWaiter is cancelled, clean out.
            if (t != null && t.waitStatus != Node.CONDITION) {
                unlinkCancelledWaiters();
                t = lastWaiter;
            }
            Node node = new Node(Thread.currentThread(), Node.CONDITION);
            if (t == null)
                firstWaiter = node;
            else
                t.nextWaiter = node;
            lastWaiter = node;
            return node;
        }

3.3 通知

調(diào)用Condition的signal()方法,將會(huì)喚醒在等待隊(duì)列中等待最長(zhǎng)時(shí)間的節(jié)點(diǎn)(條件隊(duì)列里的首節(jié)點(diǎn)),在喚醒節(jié)點(diǎn)前,會(huì)將節(jié)點(diǎn)移到同步隊(duì)列中。當(dāng)前線(xiàn)程加入到等待隊(duì)列中如圖所示:

在這里插入圖片描述

回到上面的demo,鎖被釋放后,線(xiàn)程Consumer開(kāi)始沉睡,這個(gè)時(shí)候線(xiàn)程因?yàn)榫€(xiàn)程Consumer沉睡時(shí),會(huì)喚醒AQS隊(duì)列中的頭結(jié)點(diǎn),所所以線(xiàn)程Producer會(huì)開(kāi)始競(jìng)爭(zhēng)鎖,并獲取到,執(zhí)行完后線(xiàn)程Producer會(huì)調(diào)用signal方法,“發(fā)出”signal信號(hào),signal方法如下:

public final void signal() {
	 if (!isHeldExclusively())
	 throw new IllegalMonitorStateException();
	 Node first = firstWaiter; //firstWaiter為condition自己維護(hù)的一個(gè)鏈表的頭結(jié)點(diǎn),
	                          //取出第一個(gè)節(jié)點(diǎn)后開(kāi)始喚醒操作
	 if (first != null)
	 doSignal(first);
	 }

在調(diào)用signal()方法之前必須先判斷是否獲取到了鎖(isHeldExclusively方法)。接著獲取等待隊(duì)列的首節(jié)點(diǎn),將其移動(dòng)到同步隊(duì)列并且利用LockSupport喚醒節(jié)點(diǎn)中的線(xiàn)程。
被喚醒的線(xiàn)程將從await方法中的while循環(huán)中退出( while (!isOnSyncQueue(node)) { 方法返回true,節(jié)點(diǎn)已經(jīng)在同步隊(duì)列中)。隨后調(diào)用同步器的acquireQueued()方法加入到同步狀態(tài)的競(jìng)爭(zhēng)當(dāng)中去。成功獲取到競(jìng)爭(zhēng)的線(xiàn)程從先前調(diào)用await方法返回,此時(shí)該線(xiàn)程已經(jīng)成功獲取了鎖。

AQS的同步隊(duì)列與Condition的等待隊(duì)列,兩個(gè)隊(duì)列的作用是不同,事實(shí)上,每個(gè)線(xiàn)程也僅僅會(huì)同時(shí)存在以上兩個(gè)隊(duì)列中的一個(gè),流程是這樣的:

在這里插入圖片描述

注意:

1.線(xiàn)程producer調(diào)用signal方法,這個(gè)時(shí)候Condition的等待隊(duì)列中只有線(xiàn)程Consumer一個(gè)節(jié)點(diǎn),于是它被取出來(lái),并被加入到AQS的等待隊(duì)列中。 注意,這個(gè)時(shí)候,線(xiàn)程Consumer 并沒(méi)有被喚醒。

2.Sync是AQS的抽象子類(lèi),實(shí)現(xiàn)可重入和互斥的大部分功能。在Sync的子類(lèi)中有FairSync和NonfairSync兩種代表公平鎖策略和非公平鎖策略。Sync lock方法留給子類(lèi)去實(shí)現(xiàn),NonfairSync的實(shí)現(xiàn):

 final void lock() {
            if (compareAndSetState(0, 1))
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);
        }

其中如果一開(kāi)始獲取鎖成功,是直接設(shè)置當(dāng)前線(xiàn)程。
否則執(zhí)行acquire(1),也就是進(jìn)入aqs等待隊(duì)列。這里不展開(kāi)細(xì)節(jié)。

可以這樣理解,整個(gè)協(xié)作過(guò)程是靠結(jié)點(diǎn)在A(yíng)QS的等待隊(duì)列和Condition的等待隊(duì)列中來(lái)回移動(dòng)實(shí)現(xiàn)的,每個(gè)隊(duì)列的意義不同,Condition作為一個(gè)條件類(lèi),很好的自己維護(hù)了一個(gè)等待信號(hào)的隊(duì)列,并在適時(shí)的時(shí)候?qū)⒔Y(jié)點(diǎn)加入到AQS的等待隊(duì)列中來(lái)實(shí)現(xiàn)的喚醒操作

到此這篇關(guān)于Java Condition類(lèi)案例詳解的文章就介紹到這了,更多相關(guān)Java Condition類(lèi)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法

    Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法

    Swagger?是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?RESTful?風(fēng)格的?Web?服務(wù),這篇文章主要介紹了Spring?Boot中使用Swagger3.0.0版本構(gòu)建RESTful?APIs的方法,需要的朋友可以參考下
    2022-11-11
  • Java中Iterator(迭代器)的用法詳解

    Java中Iterator(迭代器)的用法詳解

    Java迭代器(Iterator)是?Java?集合框架中的一種機(jī)制,它提供了一種在不暴露集合內(nèi)部實(shí)現(xiàn)的情況下遍歷集合元素的方法。本文主要介紹了它的使用方法,希望對(duì)大家有所幫助
    2023-05-05
  • Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例

    Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例

    這篇文章主要介紹了Leetcode常見(jiàn)鏈表問(wèn)題及代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名

    java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名

    這篇文章主要介紹了java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名,主要用在做主題時(shí)替換這些常見(jiàn)應(yīng)用的圖片,需要的朋友可以參考下
    2014-06-06
  • java實(shí)現(xiàn)刪除某條信息并刷新當(dāng)前頁(yè)操作

    java實(shí)現(xiàn)刪除某條信息并刷新當(dāng)前頁(yè)操作

    這篇文章主要介紹了java實(shí)現(xiàn)刪除某條信息并刷新當(dāng)前頁(yè)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Spring?cache源碼深度解析

    Spring?cache源碼深度解析

    緩存用于提升系統(tǒng)的性能,特別適用于一些對(duì)資源需求比較高的操作,下面這篇文章主要給大家介紹了關(guān)于Spring?cache源碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • Spring Cloud Gateway入門(mén)解讀

    Spring Cloud Gateway入門(mén)解讀

    本篇文章主要介紹了Spring Cloud Gateway入門(mén)解讀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • SpringBoot集成Redis向量數(shù)據(jù)庫(kù)實(shí)現(xiàn)相似性搜索功能

    SpringBoot集成Redis向量數(shù)據(jù)庫(kù)實(shí)現(xiàn)相似性搜索功能

    Redis?是一個(gè)開(kāi)源(BSD?許可)的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ),用作數(shù)據(jù)庫(kù)、緩存、消息代理和流式處理引擎,向量檢索的核心原理是通過(guò)將文本或數(shù)據(jù)表示為高維向量,并在查詢(xún)時(shí)根據(jù)向量的相似度進(jìn)行搜索,本文給大家介紹了SpringBoot集成Redis向量數(shù)據(jù)庫(kù)實(shí)現(xiàn)相似性搜索功能
    2024-09-09
  • Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式

    Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式

    這篇文章主要介紹了Jackson中json格式的字符串與對(duì)象的互相轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程

    RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程

    這篇文章主要為大家介紹了RocketMQ?NameServer架構(gòu)設(shè)計(jì)啟動(dòng)流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論

呼图壁县| 黔南| 济宁市| 柳江县| 宁陕县| 汉源县| 湘西| 桦甸市| 农安县| 健康| 连山| 历史| 广宗县| 南通市| 磐安县| 松江区| 临桂县| 福鼎市| 桓台县| 河北区| 镇雄县| 英超| 大港区| 高密市| 城固县| 虞城县| 万全县| 广平县| 林州市| 双辽市| 白山市| 宣城市| 阳谷县| 宁强县| 百色市| 衡水市| 靖州| 马公市| 原平市| 军事| 辽阳县|