- 博客(8)
- 收藏
- 关注
原创 CountDownLatch,CyclicBarrier和Semphore的使用及示例,区别
System.out.println(Thread.currentThread().getName()+"开始使用");System.out.println(Thread.currentThread().getName()+"使用结束");System.out.println(Thread.currentThread().getName()+"已经加入会议");2.当线程在使用资源前使用.acquire()获取使用资格,使用完成后调用release()唤醒其它等待资源的使用。
2025-02-24 17:31:01
936
原创 虚假唤醒问题
结果分析:后面四行的为什么会打印?消费者线程指定小于等于0就无法消费,但结果竟然打印-1,这就是虚假唤醒导致的。因为wait在哪阻塞在哪唤醒继续执行,由于consumer0,1,2,3提前进入了等待状态,因此当被唤醒后,没有再次进入资源数量判断,直接进行了消费,导致异常。,导致线程继续从阻塞的地方向下执行,造成意想不到的执行结果。为了避免虚假唤醒,在进行条件判断时,案例:有五个生产者生产资源,五个消费者消费,容器最多容纳3个资源。虚假唤醒是指将等待资源的线程唤醒时并不满足线程的执行条件,但由于。
2025-02-21 16:35:55
120
原创 wait和notify/notifyAll;await和signal/signalAll的使用,区别及其注意事项,使用wait有时候导致current thread is not owner的原因
在消费者和生产者模型中,经常需要消费者线程和生产者线程对资源进行判断后执行生产和消费操作,例如,当工厂中的无产品时,消费者就需要进行等待生产者生产,当生产者生产后通知消费者进行消费;上述例子中synchronized加在普通方法上,因此它作用的是当前对象,因此唤醒的就是一个或者所有持有当前对象锁并处于等待的线程。因此,总结,在多个condition一般存在于环形调用的情况下,存在的问题是,由于其共用一个锁,因此每个步骤执行时,其它的只能等待。为什么强调唤醒的是持有当前对象的锁并进行等待的线程?
2025-02-21 16:29:31
738
原创 ReentrantLock中lockInterruptibly和lock的使用,synchronized和ReentrantLock的区别
上述示例中两个线程发生死锁,由于使用的是lockInterruptibly()获取锁的方式,因此t1线程调用interrupt方法时,线程1被中断,锁释放,线程B获取到锁A。释放锁:当线程退出被锁保护的代码块时,锁的持有技术减少,当持有计数减少到0时,锁被释放,其它线程可以获取。System.out.println("t1线程想获取锁A...");System.out.println("t1线程想获取锁B...");System.out.println("t1线程获取锁A成功");
2025-02-19 10:48:32
591
原创 Synchronized的详细使用方法及示例,如何确定不同线程获取的是同一锁对象
synchronized修饰代码块时可以自己指定锁对象,可以是当前类,也可以是当前对象,如果是当前对象,则在不同线程中同一对象调用该代码块时,才会达到互斥条件;如果锁对象是当前类,则现象和修饰静态方法时一样,不同线程中代码块是当前类时,触发互斥条件。synchronized关键字用于代码块或者方法进行加锁,对于同一线程可重入,当不同线程同一时间获取同一把锁,会出现锁互斥,只有当当前线程执行完后,其它线程拿到锁后才能执行被synchronized修饰的代码块和方法。//使用子线程中创建的实例。
2025-02-18 16:31:50
537
原创 WebSocket入门,java中如何使用WebSocket
WebSocket是独立的,创建在TCP上的协议。WebSocket通过HTTP/1.1协议的101状态码进行握手为了创建WebSocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程称为"握手"基于浏览器定时发送请求,然后由服务器返回最新的数据给客户端浏览器,这种传统模式,需要浏览器不断发送请求,HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,这样会浪费很多的带宽资源。
2025-02-18 11:40:44
966
原创 rabbitmq中publisher和consumer中哪个进行了Exchange和queue的声明,先进行启动,完成Exchange和queue的创建后才能成功进行消息发布和订阅
原因:在使用rabbitTemplate进行消息发布前,必须提前声明所用到的角色,比如exchange,queue,以及对其进行关系绑定。一般声明可以通过@Bean组件的方式,也可以在Consumer端使用@RabbitListener()注解进行声明,如果在consumer中进行声明了,则必须先启动consumer服务,创建好对应的exchange和queue之后,消息的发布才能正常。System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
2025-02-13 15:31:29
207
原创 SpingAMQP中的RabbitTemplate实例调用convertAndSend无法创建RabbitMQ服务器上不存在的队列
在使用SpringAMQP练习基本消息队列时,发现使用rabbitTemplate.convertAndSend发布消息时,RabbitMQ服务器上可以看到connections和channels正常,但在queues下找不到对应的queue。需要依赖于在rabbitmq管理器上创建或者在代码中通过SpringAMQP的声明队列机制进行队列声明。也就是要么在rabbitmq的管理页面上先手动添加一个需要发布消息的queue或者需要代码提前声明queue。
2025-02-13 14:13:21
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人