以下代码,semaphore会不会引起一些同步的问题(重入),需要修改吗

问题描述

package learn;import java.util.concurrent.Semaphore;class applePlate{static Semaphore apple = new Semaphore(2);static Semaphore space = new Semaphore(3);}class Eater implements Runnable{String name;Object o;Eater(String name, Object o){this.name = name;this.o = o;}public void run(){int count = 4;while(count-- > 0){try{applePlate.apple.acquire();}catch(InterruptedException e){throw new RuntimeException(e);}applePlate.space.release();System.out.println("Eater " + name +" eat"+" :left " + applePlate.apple.availablePermits());}}}class Producer implements Runnable{String name;Object o;Producer(String name, Object o){this.name = name;this.o = o;}public void run(){int count = 3;while(count-- > 0){try{applePlate.space.acquire();}catch(InterruptedException e){throw new RuntimeException(e);}applePlate.apple.release();System.out.println("Producer " + name +" produce"+" :left " + applePlate.apple.availablePermits());}}}class Go {public static void main(String args[]){Object o = new Object();Eater e1 = new Eater("eee", o), e2 = new Eater("eee2", o);Producer p1 = new Producer("ppp", o), p2 = new Producer("ppp2", o);Thread th1 = new Thread(e1);Thread th2 = new Thread(e2);Thread th3 = new Thread(p1);Thread th4 = new Thread(p2);th1.start();th2.start();th3.start();th4.start();}}

解决方案

信号量只是在信号不够的时候挂起线程,但是并不能保证信号量足够的时候获取对象和返还对象是线程安全的。所以你还需要有Lock来保证并发的正确性。
解决方案二:
"并不能保证信号量足够的时候获取对象和返还对象是线程安全的" 这是哪家的Java Doc声明的?

时间: 2024-09-20 00:00:58

以下代码,semaphore会不会引起一些同步的问题(重入),需要修改吗的相关文章

java代码-怎么通过点击按钮实现重命名编辑修改文字

问题描述 怎么通过点击按钮实现重命名编辑修改文字 请问下这代码怎么写: 点击按钮实现重命名编辑!大神们,帮解答!蟹蟹了 解决方案 通过按键控件的 setText 成员函数来设置. 解决方案二: 先获得这个控件然后加setOnClicker监听函数,里面用setText函数来改变文字. 解决方案三: 1.获取Button控件.TextView控件,并设置监听器 mTextView=(TextView)findViewById(R.id.textView1); mButton=(Button)fin

git学习------>从SVN迁移到Git之后,项目开发代码继续在SVN提交,如何同步迁移之后继续在SVN提交的代码到Git?

最近逐步逐步的将公司的项目都从SVN往Git迁移了,但是想团队成员都能够一步到位就迁移到Git是不可能的,因为还有大部分人都还不会Git,所以整个过渡过程估计得大半年. 因此导致虽然项目迁移过来了,但是团队开发还是在SVN提交代码.所以得想个办法同步迁移之后继续在SVN提交的代码到Git来,不然到时候又得做一次迁移操作得多操蛋. 在网上查看了下资料,都是讲SVN迁移到Git的过程,并没有讲解迁移之后团队成员继续在SVN提交代码,然后需要同步最新的SVN提交记录到Git的过程,因此自己慢慢探索,居

跟着实例学习ZooKeeper的用法: 分布式锁

锁 分布式的锁全局同步, 这意味着任何一个时间点不会有两个客户端都拥有相同的锁. 可重入锁Shared Reentrant Lock 首先我们先看一个全局可重入的锁. Shared意味着锁是全局可见的, 客户端都可以请求锁. Reentrant和JDK的ReentrantLock类似, 意味着同一个客户端在拥有锁的同时,可以多次获取,不会被阻塞. 它是由类InterProcessMutex来实现. 它的构造函数为: public InterProcessMutex(CuratorFramewor

银行取款[多线程]{使用重入锁Lock接口ReentrantLock锁确保线程同步}

经典例子:老婆(朱丽叶)老公(罗密欧),使用银行卡和存折,或者网银等,同时对同一账户操作的安全问题.  此处用多线程实现,同时取款的模拟实现,使用使用Lock接口ReentrantLock锁确保线程同步,查看取款安全隐患问题,代码如下: -----------------------------------------------------------------------------------------------------------------------------------

重入锁死

原文链接 作者:Jakob Jenkov 译者:刘晓日 校对:丁一 重入锁死与死锁和嵌套管程锁死非常相似.锁和读写锁两篇文章中都有涉及到重入锁死的问题. 当一个线程重新获取锁,读写锁或其他不可重入的同步器时,就可能发生重入锁死.可重入的意思是线程可以重复获得它已经持有的锁.Java的synchronized块是可重入的.因此下面的代码是没问题的: (译者注:这里提到的锁都是指的不可重入的锁实现,并不是Java类库中的Lock与ReadWriteLock类) 查看源代码 打印帮助 1 public

jvm(13)-线程安全与锁优化(转)

0.1)本文部分文字转自"深入理解jvm", 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 1)线程安全定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的:(干货--线程安全定义) [2.1]java 语言中的线程安全(干货-

javascript动态加载二_javascript技巧

在上一篇javascript动态加载中,提到了使用同步加载策略这一个方式来实现如 复制代码 代码如下: Using("jquery"); Using("User"); $("#ID").click(function(){ var user = new User(); user.name = "xx"; user.show(); }); 由于JS是单线程的,所以同步策略带来的坏处不少,比如阻止之后的代码运行.造成浏览器假死等问题

linux内核分析笔记----中断和中断处理程序【转】

转自:http://www.cnblogs.com/hanyan225/archive/2011/07/17/2108609.html 中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的..        那么什么叫中断呢, 中断还是打断,这样一说你就不明白了.唉,中断还真是有点像打断.我们知道linux管理所有的硬件设备,要做的第一件事先是通信.然后,我们天天在说一句话:处理器的速度跟外围硬件设备的速度往往不在一个数量级上,甚至几个数量级的差别,这

linux多线程编程详解教程(线程通过信号量实现通信代码)_linux shell

线程分类 线程按照其调度者可以分为用户级线程和核心级线程两种. (1)用户级线程 用户级线程主要解决的是上下文切换的问题,它的调度算法和调度过程全部由用户自行选择决定,在运行时不需要特定的内核支持.在这里,操作系统往往会提供一个用户空间的线程库,该线程库提供了线程的创建.调度.撤销等功能,而内核仍然仅对进程进行管理.如果一个进程中的某一个线程调用了一个阻塞的系统调用,那么该进程包括该进程中的其他所有线程也同时被阻塞.这种用户级线程的主要缺点是在一个进程中的多个线程的调度中无法发挥多处理器的优势.