Code Bye

java进程间同步问题,

有一个map,创建100个进程,向里面加元素,又创建了200个进程,减元素,怎么实现同步,组后总是不能输出800
该怎么实现
import java.util.HashMap;
import java.util.Map;
import java.util.Vector;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestMultiThread{
    ?    ?public static Map<String,Vector<String>> map = new HashMap<String,Vector<String>>();
       ? ?public static void main(String[] args) {
    ?       ?    ? ?ExecutorService executor = Executors.newCachedThreadPool();
    ?    ?    ?    ?for(int i = 0 ; i < 1000; i++){
    ?    ?    ?    ?    ?    ?executor.execute(new AddMap(“username”,”asd”,map));
    ?    ?    ?    ?    ?}
    ?    ?    ?    ?for(int i = 0 ; i < 200; i++){
    ?    ?    ?    ?    ?    ?    ?    ?executor.execute(new DeleteMap(“username”,”asd”,map));
    ?    ?    ?    ?}
    ?    ?    ?    ?executor.shutdown();
    ?    ?    ?    ?while(!executor.isTerminated());
    ?    ?}
    ?    ?public static void mapSize(String username){
    ?    ?    ?    ?System.out.println(map.get(username));
    ?    ?    ?    ?System.out.println(map.get(username).size());
    ?    ?}
}
class AddMap extends Thread{
    ?    ?    ?public Map<String,Vector<String>> map = new HashMap<String,Vector<String>>();
    ?    ?    ?private String username;
    ?    ?    ?private String value;
    ?    ?    public AddMap(String username,String value,Map<String,Vector<String>> map){
    ?    ?    ?    ?    ?    ?    ?this.username = username;
    ?    ?    ?    ?    ?    ?    ?this.value = value;
    ?    ?    ?    ?    ?    ?    ?this.map = map;
    ?    ?    ?}
    ?    ?    ?public void run(){
    ?    ?    ?    ?    ?    ?synchronized(map){
    ?    ?    ?    ?    ?    ?    ?    ?    ?addMap(username,value);
    ?    ?    ?    ?    ?    ?    ?    ?    ?TestMultiThread.mapSize(username);
    ?    ?    ?    ?    ?    ?    ?    ?    ?map.notifyAll();
    ?    ?    ?    ?    ?    ?    ?}
}
private  void addMap(String username,String value){
    ?    ?    ?    ?    ?if(!map.containsKey(username)){
    ?    ?    ?    ?    ?    ?    ?    ?    ?map.put(username, new Vector<String>());
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?map.get(username).add(value);
    ?    ?    ?    ?    ?}else{
   ?    ?    ?    ?    ?    ?    ?    ?    ?map.get(username).add(value);
    ?    ?    ?    ?    ?    ?    ?}
    ?    ?    ?    ?    try {
    ?    ?    ?    ?    ?    ?    ?    ?Thread.sleep(0);
    ?    ?    ?    ?    ?    ?    ?} catch (InterruptedException e) {
    ?    ?    ?    ?    ?    ?    ?// TODO 自动生成的 catch 块
    ?    ?    ?    ?    ?    ?    ?e.printStackTrace();
    ?    ?    ?    ?    ?    ?}
    ?    ?    ?    ?    ?}
}
class DeleteMap extends Thread{
    ?    ?    ?    ?public Map<String,Vector<String>> map = new HashMap<String,Vector<String>>(); 
    ?    ?    ?    ?private String username;
    ?    ?    ?    ?private String value;
    ?    ?    ?    ?public DeleteMap(String username,String value,Map<String,Vector<String>> map){
    ?    ?    ?    ?this.username = username;
    ?    ?    ?    ?this.value = value;
    ?    ?    ?    ?this.map = map;
    ?    ?    ?}
    ?    ?    ?    ?    ?public void run(){
    ?    ?    ?    ?    ?    ?    ?synchronized(map){
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?if(map == null){
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?try {
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?map.wait();
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?} catch (InterruptedException e) {
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?// TODO 自动生成的 catch 块
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?e.printStackTrace();
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?}
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?}
        ?    ?    ?    ?    ?    ?    ?    ??deleteMap(username,value);
    ?    ?    ?    ?    ?    ?    ?    ?    ?TestMultiThread.mapSize(username);
    ?    ?    ?    ?    ?    ?}
    ?    ?    ?    ?}
    ?    ?    ?    ?private  void deleteMap(String username,String value){
    ?    ?    ?    ?    ?    ?    ?if(map.containsKey(username)){
    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?    ?map.remove(username);
    ?    ?    ?    ?    ?    ?    ?}
    ?    ?    ?    ?}
}


5分
没太明白你想干嘛,代码格式也不够好
这样说吧,就是主类里面有一个Vector,然后有1000个线程往里面添加数据,而又有500个线程在删除vector里面的数据,如果线程调度合理则最后vector里面会有1000-500=500个数据,我觉得就像是多个生产者多个消费者问题(刚学多线程,不知道可不可以这样理解),我不知道怎么协调这1000个生产者和这500个消费者之间实现同步

15分
你的线程数很不适合啊…通常服务器也就8核….有20个线程数就很多拉.这样才能最高的性能…同步也就?synchronized就ok…要高的性能,要使用无锁算法…
我也就是测试下,其实我是想弄明白怎么实现一个多生产者多消费者的的例子(生产者和消费者的数目不同)。我做了一个练习,在服务器端,有多个进程要对同一个map变量访问,有的添加数据,有的删除数据,那么这些进程是否会出现问题?还有就是在客户端,服务器返回值,然后客户端将这个值存在一个vector中,同时客户端也要一直从这个vector中读取?那么这两个读(客户端)写(服务器)过程是否会出问题?谢谢!

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java进程间同步问题,