码迷,mamicode.com
首页 > 编程语言 > 详细

java_线程安全-service

时间:2015-08-29 23:02:59      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:

package com.demo.test;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * @author QQ: 1236897
 *
 */

//基于委托的线程安全
class Point {

    public final int x, y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "x: "+x+", y: "+y;
    }

}
//返回locations后 修改point坐标,对返回map里的point->有影响
class DelegateTracker {

    private final ConcurrentMap<String, Point> locations;
    private final Map<String, Point> unmodifiableMap;

    public DelegateTracker(Map<String, Point> points) {

        locations = new ConcurrentHashMap<String, Point>(points);
        unmodifiableMap = Collections.unmodifiableMap(locations);
    }

    public Map<String, Point> getLocations() {
        return unmodifiableMap;
    }

    public Point getLocation(String id) {
        return locations.get(id);
    }

    public void setLocation(String id, int x, int y) {
        if (locations.replace(id, new Point(x, y)) == null) {
            throw new IllegalArgumentException("invalid id - " + id);
        }
    }

}

//返回locations后 修改point坐标,对返回map里的point -> 没有影响
class DelegateTrackerFixedPoint {

    private final ConcurrentMap<String, Point> locations;
    private final Map<String, Point> unmodifiableMap;

    public DelegateTrackerFixedPoint(Map<String, Point> points) {

        locations = new ConcurrentHashMap<String, Point>(points);
        unmodifiableMap = Collections.unmodifiableMap(locations);
    }

    //不同
    public Map<String, Point> getLocations() {
        return Collections.unmodifiableMap(new HashMap<String,Point>(locations));
    }

    public Point getLocation(String id) {
        return locations.get(id);
    }

    public void setLocation(String id, int x, int y) {
        if (locations.replace(id, new Point(x, y)) == null) {
            throw new IllegalArgumentException("invalid id - " + id);
        }
    }

}




public class ThreadDemo1 {

    public static void main(String[] args) {
        
        //test1 - DelegateTracker 
        Point p1 = new Point(1,1);
        Point p2 = new Point(2,2);
        Point p3 = new Point(3,3);
        Point p4 = new Point(4,4);
        Point p5 = new Point(5,5);
        
        Map<String,Point> points = new HashMap<String,Point>();
        
        points.put("1", p1);
        points.put("2", p2);
        points.put("3", p3);
        points.put("4", p4);
        points.put("5", p5);
        
        DelegateTracker delegateTracker = new DelegateTracker(points);
        
        delegateTracker.setLocation("2", 99, 99);
        
        Map<String,Point> result = delegateTracker.getLocations();
        
        delegateTracker.setLocation("3", 33, 33);
        
        
        for(String key:result.keySet())
        {
            Point point = result.get(key);
            System.out.println(point.toString());
        }
        System.out.println("-----------------------------------------");
        
        
        //test2 - DelegateTrackerFixedPoint
        Point f1 = new Point(1,1);
        Point f2 = new Point(2,2);
        Point f3 = new Point(3,3);
        Point f4 = new Point(4,4);
        Point f5 = new Point(5,5);
        
        Map<String,Point> points2 = new HashMap<String,Point>();
        
        points2.put("1", f1);
        points2.put("2", f2);
        points2.put("3", f3);
        points2.put("4", f4);
        points2.put("5", f5);
        
        DelegateTrackerFixedPoint delegateTrackerFixedPoint = new DelegateTrackerFixedPoint(points2);
        
        delegateTrackerFixedPoint.setLocation("2", 99, 99);
        
        Map<String,Point> result2 = delegateTrackerFixedPoint.getLocations();
        
        delegateTrackerFixedPoint.setLocation("3", 33, 33);
        
        for(String key:result2.keySet())
        {
            Point point = result2.get(key);
            System.out.println(point.toString());
        }
    }

}

 

package com.demo.test2;

import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

/**
 * @author QQ: 1236897
 *
 */
// 基于发布的线程安全 操作对象安全
class SafePoint {

    private int x, y;

    private SafePoint(int[] a) {
        this(a[0], a[1]);
    }

    public SafePoint(SafePoint p) {
        this(p.get());
    }

    public SafePoint(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public synchronized int[] get() {
        return new int[] { x, y };
    }

    public synchronized void set(int x, int y) {
        this.x = x;
        this.y = y;
    }

}

//取出 Locations后,如果更改点位置,locations里的点会跟随变化
class PublishTracker{
    
    private final ConcurrentMap<String, SafePoint> locations;
    private final Map<String, SafePoint> unmodifiableMap;
    
    public PublishTracker(Map<String, SafePoint> points) {

        locations = new ConcurrentHashMap<String, SafePoint>(points);
        unmodifiableMap = Collections.unmodifiableMap(locations);
    }
    
    public Map<String, SafePoint> getLocations() {
        return unmodifiableMap;
    }

    public SafePoint getLocation(String id) {
        return locations.get(id);
    }

    public void setLocation(String id, int x, int y) {
        if (!locations.containsKey(id)) {
            throw new IllegalArgumentException("invalid id - " + id);
        }
        locations.get(id).set(x, y);
    }
    
}

public class ThreadTest2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

    }

}

 

java_线程安全-service

标签:

原文地址:http://www.cnblogs.com/MarchThree/p/4769851.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!