前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Java并发编程之ReentrantLock

Java并发编程之ReentrantLock

作者头像
冬天vs不冷
发布于 2025-01-21 00:03:56
发布于 2025-01-21 00:03:56
6700
代码可运行
举报
文章被收录于专栏:springbootspringboot
运行总次数:0
代码可运行

1、死锁

一个线程需要 同时获取多把锁,这时就容易发生死锁

如:线程1获取A对象锁, 线程2获取B对象锁; 此时线程1又想获取B对象锁, 线程2又想获取A对象锁; 它们都等着对象释放锁, 此时就称为死锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static void main(String[] args) {
	final Object A = new Object();
	final Object B = new Object();
	
	new Thread(()->{
		synchronized (A) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (B) {

			}
		}
	}).start();

	new Thread(()->{
		synchronized (B) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			synchronized (A) {

			}
		}
	}).start();
}

2、活锁

活锁出现在两个线程互相改变对方的结束条件,谁也无法结束

死锁与活锁的区别

  • 死锁是因为线程互相持有对象想要的锁,并且都不释放,最后到时线程阻塞,停止运行的现象。
  • 活锁是因为线程间修改了对方的结束条件,而导致代码一直在运行,却一直运行不完的现象。

3、饥饿

  • 某些线程因为优先级太低,导致一直无法获得资源的现象
  • 在使用顺序加锁时,可能会出现饥饿现象

4、ReentrantLock

4.1、基本语法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//获取ReentrantLock对象
private ReentrantLock lock = new ReentrantLock();
//加锁
lock.lock();
try {
	//需要执行的代码
}finally {
	//释放锁
	lock.unlock();
}

4.2、支持锁重入

  • 可重入锁是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此 有权利再次获取这把锁
  • 如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ReentrantTest {
    private static ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        // 如果有竞争就进入`阻塞队列`, 一直等待着,不能被打断
        lock.lock();
        try {
            System.out.println("entry main...");
            m1();
        } finally {
            lock.unlock();
        }
    }
    private static void m1() {
        lock.lock();
        try {
            System.out.println("entry m1...");
            m2();
        } finally {
            lock.unlock();
        }
    }
    private static void m2() {
        System.out.println("entry m2....");
    }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
entry main...
entry m1...
entry m2....

Process finished with exit code 0

4.3、可中断 (针对于lockInterruptibly()方法获得的中断锁)

  • synchronized 和 reentrantlock.lock() 的锁, 是不可被打断的; 也就是说别的线程已经获得了锁, 我的线程就需要一直等待下去. 不能中断
  • 可被中断的锁, 通过lock.lockInterruptibly()获取的锁对象, 可以通过调用阻塞线程的interrupt()方法打断
  • 如果某个线程处于阻塞状态,可以调用其interrupt方法让其停止阻塞,获得锁失败
  • 处于阻塞状态的线程,被打断了就不用阻塞了,直接停止运行
  • 可中断的锁, 在一定程度上可以被动的减少死锁的概率, 之所以被动, 是因为我们需要手动调用阻塞线程的interrupt方法;

使用lock.lockInterruptibly()可以从阻塞队列中打断

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ReentrantTest {
    private static final ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            System.out.println("t1线程启动...");
            try {
                // lockInterruptibly()是一个可打断的锁, 如果有锁竞争在进入阻塞队列后,可以通过interrupt进行打断
                lock.lockInterruptibly();
            } catch (InterruptedException e) {
                e.printStackTrace();
                System.out.println("等锁的过程中被打断"); //没有获得锁就被打断跑出的异常
                return;
            }
            try {
                System.out.println("t1线程获得了锁");
            } finally {
                lock.unlock();
            }
        }, "t1");
        // 主线程获得锁(此锁不可打断)
        lock.lock();
        System.out.println("main线程获得了锁");
        // 启动t1线程
        t1.start();
        try {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t1.interrupt();            //打断t1线程
            System.out.println("执行打断");
        } finally {
            lock.unlock();
        }
    }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main线程获得了锁
t1线程启动...
执行打断
等锁的过程中被打断
java.lang.InterruptedException
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireInterruptibly(AbstractQueuedSynchronizer.java:898)
	at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1222)
	at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
	at com.xc.day1.ReentrantTest.lambda$main$0(ReentrantTest.java:27)
	at java.lang.Thread.run(Thread.java:748)

Process finished with exit code 0

使用lock.lock()不可以从阻塞队列中打断, 一直等待别的线程释放锁

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ReentrantTest {
    private static final ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            System.out.println("t1线程启动...");
            lock.lock();
            try {
                System.out.println("t1线程获得了锁");
            } finally {
                lock.unlock();
            }
        }, "t1");
        // 主线程获得锁(此锁不可打断)
        lock.lock();
        System.out.println("main线程获得了锁");
        // 启动t1线程
        t1.start();
        try {
            try {
                Thread.sleep(4000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t1.interrupt();            //打断t1线程
            System.out.println("main线程执行打断");
        } finally {
            lock.unlock();
        }
    }
}
  • lock()锁不能被打断, 在主线程中调用t1.interrupt(),t1没被打断, 当主线程释放锁之后, t1获得了锁

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main线程获得了锁
t1线程启动...
main线程执行打断
t1线程获得了锁

Process finished with exit code 0

4.4、锁超时 (lock.tryLock())

  • 使用 lock.tryLock() 方法会返回获取锁是否成功。如果成功则返回true,反之则返回false
  • 并且tryLock方法可以设置指定等待时间,参数为:tryLock(long timeout, TimeUnit unit) , 其中timeout为最长等待时间,TimeUnit为时间单位
  • 获取锁的过程中, 如果超过等待时间, 或者被打断, 就直接从阻塞队列移除, 此时获取锁就失败了, 不会一直阻塞着 ! (可以用来实现死锁问题)

不设置等待时间, 立即失败

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ReentrantTest {
    private static final ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            System.out.println("尝试获得锁");
            // 此时肯定获取失败, 因为主线程已经获得了锁对象
            if (!lock.tryLock()) {
                System.out.println("获取立刻失败,返回");
                return;
            }
            try {
                System.out.println("获得到锁");
            } finally {
                lock.unlock();
            }
        }, "t1");

        lock.lock();
        System.out.println("获得到锁");
        t1.start();
        // 主线程2s之后才释放锁
        try {
            Thread.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("释放了锁");
        lock.unlock();
    }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
获得到锁
尝试获得锁
获取立刻失败,返回
释放了锁

Process finished with exit code 0

设置等待时间, 超过等待时间还没有获得锁, 失败, 从阻塞队列移除该线程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ReentrantTest {
    private static final ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            System.out.println("尝试获得锁");
            try {
                // 设置等待时间, 超过等待时间 / 被打断, 都会获取锁失败; 退出阻塞队列
                if (!lock.tryLock(1, TimeUnit.SECONDS)) {
                    System.out.println("获取锁超时,返回");
                    return;
                }
            } catch (InterruptedException e) {
                System.out.println("被打断了, 获取锁失败, 返回");
                e.printStackTrace();
                return;
            }
            try {
                System.out.println(Thread.currentThread().getName()+"获得到锁");
            } finally {
                lock.unlock();
            }
        }, "t1");
        lock.lock();
        System.out.println(Thread.currentThread().getName()+"获得到锁");
        t1.start();
//        t1.interrupt();
        // 主线程2s之后才释放锁
        Thread.sleep(2);
        System.out.println("main线程释放了锁");
        lock.unlock();
    }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
main获得到锁
尝试获得锁
main线程释放了锁
t1获得到锁

Process finished with exit code 0

4.5、公平锁 new ReentrantLock(true)

  • ReentrantLock默认是非公平锁, 可以指定为公平锁
  • 在线程获取锁失败,进入阻塞队列时,先进入的会在锁被释放后先获得锁。这样的获取方式就是公平的。一般不设置ReentrantLock为公平的, 会降低并发度
  • Synchronized底层的Monitor锁就是不公平的, 和谁先进入阻塞队列是没有关系的
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//默认是不公平锁,需要在创建时指定为公平锁
ReentrantLock lock = new ReentrantLock(true);

公平锁 (new ReentrantLock(true))

  • 公平锁, 把竞争的线程放在一个先进先出的阻塞队列上
  • 只要持有锁的线程执行完了, 唤醒阻塞队列中的下一个线程获取锁即可; 此时先进入阻塞队列的线程先获取到锁

非公平锁 (synchronized, new ReentrantLock())

  • 非公平锁, 当阻塞队列中已经有等待的线程A了, 此时后到的线程B, 先去尝试看能否获得到锁对象.
  • 如果获取成功, 此时就不需要进入阻塞队列了. 这样以来后来的线程B就先活的到锁了

4.6、条件变量

  • synchronized 中也有条件变量,就是Monitor监视器中的 waitSet等待集合,当条件不满足时进入waitSet 等待
  • reentrantLock 的条件变量比 synchronized 强大之处在于,它是支持多个条件变量
  • 这就好比synchronized 是那些不满足条件的线程都在一间休息室等通知; (此时会造成虚假唤醒), 而 ReentrantLock 支持多间休息室,有专门等烟的休息室、专门等早餐的休息室、唤醒时也是按休息室来唤醒; (可以避免虚假唤醒)

等待唤醒

  • await 前需要 获得锁
  • await 执行后,会释放锁,进入 conditionObject (条件变量)中等待
  • await 的线程被唤醒(或打断、或超时)取重新竞争 lock 锁,竞争 lock 锁成功后,从 await 后继续执行
  • signal 方法用来唤醒条件变量(等待室)汇总的某一个等待的线程
  • signalAll方法, 唤醒条件变量(休息室)中的所有线程
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConditionVariable {
    private static boolean hasCigarette = false;
    private static boolean hasTakeout = false;
    private static final ReentrantLock lock = new ReentrantLock();
    // 等待烟的休息室
    static Condition waitCigaretteSet = lock.newCondition();
    // 等外卖的休息室
    static Condition waitTakeoutSet = lock.newCondition();

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+":有烟没?[{"+hasCigarette+"}]");
                while (!hasCigarette) {
                    System.out.println(Thread.currentThread().getName()+":没烟,先歇会!");
                    try {
                        // 此时小南进入到 等烟的休息室
                        waitCigaretteSet.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName()+":烟来咯, 可以开始干活了");
            } finally {
                lock.unlock();
            }
        }, "小南").start();

        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+":外卖送到没?[{"+hasTakeout+"}]");
                while (!hasTakeout) {
                    System.out.println(Thread.currentThread().getName()+":没外卖,先歇会!");
                    try {
                        // 此时小女进入到 等外卖的休息室
                        waitTakeoutSet.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName()+":外卖来咯, 可以开始干活了");
            } finally {
                lock.unlock();
            }
        }, "小女").start();

        Thread.sleep(1000);
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+":送外卖的来咯~");
                hasTakeout = true;
                // 唤醒等外卖的小女线程
                waitTakeoutSet.signal();
            } finally {
                lock.unlock();
            }
        }, "送外卖的").start();

        Thread.sleep(1000);
        new Thread(() -> {
            lock.lock();
            try {
                System.out.println(Thread.currentThread().getName()+":送烟的来咯~");
                hasCigarette = true;
                // 唤醒等烟的小南线程
                waitCigaretteSet.signal();
            } finally {
                lock.unlock();
            }
        }, "送烟的").start();
    }
}

输出结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
小南:有烟没?[{false}]
小南:没烟,先歇会!
小女:外卖送到没?[{false}]
小女:没外卖,先歇会!
送外卖的:送外卖的来咯~
小女:外卖来咯, 可以开始干活了
送烟的:送烟的来咯~
小南:烟来咯, 可以开始干活了

Process finished with exit code 0

5、Lock和synchronized区别

6、同步模式之顺序控制 (案例)

  • 假如有两个线程, 线程A打印1, 线程B打印2
  • 要求: 程序先打印2, 再打印1

6.1、wait/notify版本实现

  • 设置标记,fasle表示:2没打印就一直等待
  • 另外线程打印2并将标记设置为true
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SyncPrintWaitTest {
    public static final Object lock = new Object();
    // t2线程释放执行过
    public static boolean t2IsRunned = false;
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                while (!t2IsRunned) {
                    try {
                        // 进入等待(waitset), 会释放锁
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("1");
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("2");
                t2IsRunned = true;
                lock.notify();
            }
        }, "t2");

        t1.start();
        t2.start();
    }
}

6.2、ReentrantLock的await/signal

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SyncPrintWaitTest {
    public static final Lock lock = new ReentrantLock();
    public static Condition condition = lock.newCondition();
    // t2线程释放执行过
    public static boolean t2IsRunned = false;
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                while (!t2IsRunned) {
                    try {
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("1");
            }finally {
                lock.unlock();
            }
        }, "t1");

        Thread t2 = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("2");
                t2IsRunned = true;
                condition.signal();
            } finally {
                lock.unlock();
            }
        }, "t2");

        t1.start();
        t2.start();
    }
}

6.3、LockSupport中的park/unpart

  • park():暂停t1线程
  • unpark(t1):恢复执行t1线程
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SyncPrintWaitTest {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            LockSupport.park();
            System.out.println("1");
        }, "t1");
        t1.start();

        new Thread(() -> {
            System.out.println("2");
            LockSupport.unpark(t1);
        }, "t2").start();
    }
}

7、同步模式之交替控制 (案例)

  • 线程1 输出 a 5次, 线程2 输出 b 5次, 线程3 输出 c 5次
  • 现在要求输出 abcabcabcabcabcabc

7.1、wait/notify版本实现

  • new WaitNotify(1, 5);初始化flag为1
  • waitFlag不为1的线程进入等待
  • waitFlag为1,与flag相等则打印1,并赋值flag为2
  • 下轮则打印2依次类推
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TestWaitNotify {
    public static void main(String[] args) {
        WaitNotify waitNotify = new WaitNotify(1, 5);
        
        new Thread(() -> {
            waitNotify.print("a", 1, 2);
        }, "a线程").start();
        
        new Thread(() -> {
            waitNotify.print("b", 2, 3);
        }, "b线程").start();
        
        new Thread(() -> {
            waitNotify.print("c", 3, 1);
        }, "c线程").start();
    }
}

@Data
@AllArgsConstructor
class WaitNotify {
    private int flag;
    // 循环次数
    private int loopNumber;
    /*
        输出内容    等待标记    下一个标记
        a           1          2
        b           2          3
        c           3          1
     */
    public void print(String str, int waitFlag, int nextFlag) {
        for (int i = 0; i < loopNumber; i++) {
            synchronized (this) {
                while (waitFlag != this.flag) {
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.print(str);
                this.flag = nextFlag;
                this.notifyAll();
            }
        }
    }
}

7.2、await/signal版本

  • 设置三个等待集合,启动三个线程分别在abc等待集合中等待
  • 先唤醒a线程,打印a,并且唤醒b
  • 依次类推
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TestAwaitSignal {
    public static void main(String[] args) throws InterruptedException {
        AwaitSignal awaitSignal = new AwaitSignal(5);
        Condition a_condition = awaitSignal.newCondition();
        Condition b_condition = awaitSignal.newCondition();
        Condition c_condition = awaitSignal.newCondition();
        
        new Thread(() -> {
            awaitSignal.print("a", a_condition, b_condition);
        }, "a").start();

        new Thread(() -> {
            awaitSignal.print("b", b_condition, c_condition);
        }, "b").start();

        new Thread(() -> {
            awaitSignal.print("c", c_condition, a_condition);
        }, "c").start();

        awaitSignal.lock();
        try {
            a_condition.signal();  //首先唤醒a线程
        } finally {
            awaitSignal.unlock();
        }
    }
}

class AwaitSignal extends ReentrantLock {
    private final int loopNumber;
    public AwaitSignal(int loopNumber) {
        this.loopNumber = loopNumber;
    }
    public void print(String str, Condition condition, Condition next) {
        for (int i = 0; i < loopNumber; i++) {
            lock();
            try {
                try {
                    condition.await();
                    System.out.print(str);
                    next.signal();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                unlock();
            }
        }
    }
}

7.3、park/unpark版本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TestParkUnpark {
    static Thread a;
    static Thread b;
    static Thread c;

    public static void main(String[] args) {
        ParkUnpark parkUnpark = new ParkUnpark(5);

        a = new Thread(() -> {
            parkUnpark.print("a", b);
        }, "a");

        b = new Thread(() -> {
            parkUnpark.print("b", c);
        }, "b");

        c = new Thread(() -> {
            parkUnpark.print("c", a);
        }, "c");

        a.start();
        b.start();
        c.start();
        LockSupport.unpark(a);
    }
}

class ParkUnpark {
    private final int loopNumber;

    public ParkUnpark(int loopNumber) {
        this.loopNumber = loopNumber;
    }

    public void print(String str, Thread nextThread) {
        for (int i = 0; i < loopNumber; i++) {
            LockSupport.park();
            System.out.print(str);
            LockSupport.unpark(nextThread);
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】《高效使用DeepSeek》036-个人形象塑造
📣开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主!
愚公搬代码
2025/04/06
2090
【大模型知识引擎】打造企业专属AI智能客服
通用大语言模型具有很多功能,用于AI智能客服应用中,可以对公开知识库进行回答,但对于细分行业,或具体企业的特有知识库,通用大模型则无法做到精确回答。
参谋带个长
2024/05/20
6530
腾讯云大模型知识引擎×DeepSeek体验指南
最近,DeepSeek 着实火爆,我满心期待着去体验一番,可每次尝试,界面上都显示 “服务器繁忙”,让人无奈。不过呢,经过一番努力摸索,我发现了腾讯云的体验中心,里面也有不少有趣的项目可以体验。现在就把链接分享给大家:腾讯云体验中心。大家感兴趣的话可以去试试,说不定能找到新惊喜! https://lke.cloud.tencent.com/lke#/experience-center/home?origin=all
小真真vip
2025/02/25
2211
黑暗料理 -- 腾讯云大模型知识引擎×DeepSeek实践
腾讯云大模型知识引擎是腾讯云提供的一种基于大模型的知识管理和推理服务。它利用先进的自然语言处理和知识图谱技术,帮助用户高效地管理和利用海量知识,支持智能问答、文本分析、推荐系统等多种应用场景。
用户10497140
2025/02/22
1830
腾讯云大模型知识引擎与DeepSeek-R1:企业智能问答平台的构建实践
随着人工智能技术的迅猛发展,大型语言模型已成为企业数字化转型的重要工具。腾讯云大模型知识引擎(LLM Knowledge Engine,简称LKE)作为面向企业客户及合作伙伴的知识应用构建平台,结合企业专属数据,能够高效构建知识问答等应用。而DeepSeek作为国内领先的大语言模型,以其卓越的表现在众多场景展现出巨大的应用潜力。本文将深入探讨如何利用腾讯云大模型知识引擎与DeepSeek-R1模型,为企业构建高效、精准的智能问答平台。
用户10266550
2025/03/09
2290
基于腾讯云大模型知识引擎的DeepSeek满血版模型搭建【法律大模型专家模型搭建实战】
随着腾讯云大模型知识引擎(LKE)正式接入DeepSeek-R1和V3两大模型,开发者与企业可借助其“联网搜索+RAG+知识库”的原子能力,快速构建行业级智能应用。无论是低代码搭建还是API深度开发,腾讯云均提供稳定、安全的技术底座。为激发创新场景落地,本次征文活动旨在挖掘大模型与行业结合的标杆案例,推动技术普惠。
一键难忘
2025/02/24
1.4K0
腾讯云X DeepSeek:API调用+联网搜索,分钟打造企业级 AI 应用
不仅上线了DeepSeek-R1和V3原版模型的API接口,还将它们接入了大模型知识引擎,并支持联网搜索,成为国内率先实现这一能力的云厂商。
小腾资讯君
2025/02/10
1.6K0
你的 AI 造型师-基于 Milvus 的服装图片搜索系统及应用
Mozat 是一家成立于 2003 年的互联网公司,总部位于新加坡,在广州和沙特阿拉伯设有分公司。Mozat 为全球移动互联网用户提供娱乐和社区服务,致力于打造一个充满乐趣的新移动世界。旗下产品 Stylepedia 是一款面向全球时尚女性的衣柜伴侣 APP。在这里,用户不仅可以打造自己的专属衣柜,还能与全世界的时尚达人在线互动,获取最 in 穿搭。
Zilliz RDS
2021/07/23
1K0
你的 AI 造型师-基于 Milvus 的服装图片搜索系统及应用
腾讯云大模型知识引擎×DeepSeek最佳实践有奖征文活动
作为一名对教育智能化充满热情的开发者,我决定利用腾讯云大模型知识引擎(LKE)驱动的DeepSeek满血版模型,搭建一个专为教育场景设计的教育顾问大模型。这个项目不仅是为了响应教育行业对高效、智能解决方案的迫切需求,也是我探索大模型技术在专业领域应用的一次实践尝试。在这个过程中,我将对模型进行全面配置,以确保它能够精准理解用户需求并提供专业化的医疗建议。
用户11539083
2025/03/02
1370
腾讯云大模型知识引擎驱动的DeepSeek满血版医疗顾问大模型搭建实战
作为一名对医疗智能化充满热情的开发者,我决定利用腾讯云大模型知识引擎(LKE)驱动的DeepSeek满血版模型,搭建一个专为医疗场景设计的医疗顾问大模型。这个项目不仅是为了响应医疗行业对高效、智能解决方案的迫切需求,也是我探索大模型技术在专业领域应用的一次实践尝试。在这个过程中,我将对模型进行全面配置,以确保它能够精准理解用户需求并提供专业化的医疗建议。
熊文豪
2025/03/02
4091
腾讯云大模型知识引擎驱动的DeepSeek满血版医疗顾问大模型搭建实战
澜舟智搭×DeepSeek:企业智能体平台全面升级,打造AI Agent应用新范式
当前,若论最为炙手可热的国产开源大模型是哪一个?想必毫无疑问当属 DeepSeek。
澜舟科技
2025/02/19
1640
腾讯云大模型知识引擎 × DeepSeek:打造企业智能化转型新引擎
在人工智能技术飞速发展的今天,大语言模型(LLM)已经成为推动企业数字化转型的重要工具。2月8日,腾讯云宣布上线 DeepSeek-R1 和 V3 原版模型的 API 接口,并将其深度集成到旗下的 大模型知识引擎 平台中。这一举措不仅为企业和开发者提供了强大的技术支持,还通过低代码和代码态两种开发模式,大幅降低了大模型应用的门槛。
是山河呀
2025/02/22
2320
腾讯云大模型知识引擎与DeepSeek集成实践,构建新零售企业的智能知识中枢
传统知识库检索存在语义理解弱、响应延迟高、数据孤岛三大痛点。某鞋服企业接入腾讯云大模型知识引擎后,客服问题解决率从32%提升至78%,响应速度缩短至1.2秒。
叶一一
2025/03/13
2110
腾讯云大模型知识引擎与DeepSeek集成实践,构建新零售企业的智能知识中枢
企业网盘 x DeepSeek,打造您的专属知识中台
今天,我们正式推出全新功能模块——「企业知识库」,将 DeepSeek 大模型+RAG 检索能力与文件管理场景深度结合,让企业内的知识数据从静态存储迈向智能应用。该功能现已通过公有云白名单开放,助力企业打造专属的“智慧大脑”。
云存储
2025/03/27
1520
企业网盘 x DeepSeek,打造您的专属知识中台
一分钟搭建RAG应用:DeepSeek模型助力企业知识管理新突破
企业中常常存在数据分散的情况,不同部门和系统各自为政,导致信息孤立。这种现象使得员工在需要信息时,往往需要在多个系统中进行搜索,增加了时间成本和难度。
Lion Long
2025/02/16
2.1K1
一分钟搭建RAG应用:DeepSeek模型助力企业知识管理新突破
基于腾讯云DeepSeekRAG,打造教辅专属智能助手
哈喽,大家好!本期咱们聊一聊如何利用腾讯云DeepSeekRAG打造属于我自己的教辅专属智能助手,从此再也不会为学习一门课程而发愁。哈哈!
熊猫钓鱼
2025/03/21
1280
基于腾讯云DeepSeekRAG,打造教辅专属智能助手
使用腾讯云大模型知识引擎×DeepSeek打造自己的私人家教
今年的专升本考试即将拉开帷幕,许多考生正全力以赴备考。在复习过程中,难免会遇到一些在复习资料中找不到的疑问,尤其是高数题,不仅搜索起来麻烦,而且由于题型千变万化,很难找到一模一样的题目。传统搜索引擎往往只能提供零散的知识点,难以满足深度学习的需求。面对这样的挑战,许多同学会选择 AI 工具来解答问题。然而,大多数 AI 工具基于概率生成,难以精准处理需要严密逻辑推理的数学问题。为了解决这一痛点,业内推出了推理模型,在生成结果前会进行逻辑推理,从而提高答案的准确性和可靠性。其中,最具代表性的就是今年火爆全网的 DeepSeek-R1 模型。不过,免费的网页版 DeepSeek-R1 在使用上存在诸多限制,且无法集成到其他应用中。别担心,腾讯云近期推出的腾讯云大模型知识引擎已全面接入 DeepSeek-R1,不仅让普通用户可以零代码轻松创建 AI 智能体,还支持专业用户通过 API 模式将其集成到自己的应用中。接下来,让我们通过一个实际例子,看看这项技术如何帮助我们解决专升本复习中的难题,提高学习效率,助力大家从容迎战考试!
Yan-英杰
2025/03/24
880
使用腾讯云大模型知识引擎×DeepSeek打造自己的私人家教
腾讯云大模型知识引擎LKE+DeepSeek结合知识库创建智能客服
视频版已发布:腾讯云大模型知识引擎LKE+DeepSeek结合知识库创建智能客服(https://cloud.tencent.com/developer/video/82098)
参谋带个长
2025/03/03
6336
零部署壁垒!DeepSeek 满血版在腾讯云大模型下,速构丝滑企业级联网应用
腾讯云大模型知识引擎是一款基于深度学习和大数据技术的人工智能平台,专为大规模知识处理、智能推理和数据分析设计。它通过强大的AI能力,帮助企业和开发者更高效地处理海量数据、构建知识图谱,并提供定制化的智能解决方案。
学无止尽5
2025/03/05
1230
零部署壁垒!DeepSeek 满血版在腾讯云大模型下,速构丝滑企业级联网应用
腾讯云大模型知识引擎 API 的开发实战:基于RAG的论文阅读助手
科研工作者,尤其是那些奋战在知识前沿的探索者们,正面临着信息洪流的巨大挑战。每天都有如潮水般涌来的学术论文,这既是机遇,也是重负。
Lion Long
2025/03/02
4961
腾讯云大模型知识引擎 API 的开发实战:基于RAG的论文阅读助手
推荐阅读
【愚公系列】《高效使用DeepSeek》036-个人形象塑造
2090
【大模型知识引擎】打造企业专属AI智能客服
6530
腾讯云大模型知识引擎×DeepSeek体验指南
2211
黑暗料理 -- 腾讯云大模型知识引擎×DeepSeek实践
1830
腾讯云大模型知识引擎与DeepSeek-R1:企业智能问答平台的构建实践
2290
基于腾讯云大模型知识引擎的DeepSeek满血版模型搭建【法律大模型专家模型搭建实战】
1.4K0
腾讯云X DeepSeek:API调用+联网搜索,分钟打造企业级 AI 应用
1.6K0
你的 AI 造型师-基于 Milvus 的服装图片搜索系统及应用
1K0
腾讯云大模型知识引擎×DeepSeek最佳实践有奖征文活动
1370
腾讯云大模型知识引擎驱动的DeepSeek满血版医疗顾问大模型搭建实战
4091
澜舟智搭×DeepSeek:企业智能体平台全面升级,打造AI Agent应用新范式
1640
腾讯云大模型知识引擎 × DeepSeek:打造企业智能化转型新引擎
2320
腾讯云大模型知识引擎与DeepSeek集成实践,构建新零售企业的智能知识中枢
2110
企业网盘 x DeepSeek,打造您的专属知识中台
1520
一分钟搭建RAG应用:DeepSeek模型助力企业知识管理新突破
2.1K1
基于腾讯云DeepSeekRAG,打造教辅专属智能助手
1280
使用腾讯云大模型知识引擎×DeepSeek打造自己的私人家教
880
腾讯云大模型知识引擎LKE+DeepSeek结合知识库创建智能客服
6336
零部署壁垒!DeepSeek 满血版在腾讯云大模型下,速构丝滑企业级联网应用
1230
腾讯云大模型知识引擎 API 的开发实战:基于RAG的论文阅读助手
4961
相关推荐
【愚公系列】《高效使用DeepSeek》036-个人形象塑造
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验