A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM代景康 高级黑马   /  2013-12-24 21:16  /  1281 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


集合里的Collection接口的两个子接口: List(列表) ,Set(集) ,ArrayList ,LinkedList ,HashSet ,TreeSet,TreeSet线程不同步的集合,Hashtable线程同步的集合,这个线程同步什么意思,有什么用?

4 个回复

倒序浏览
线程同步就是多个线程可以同时操作这个集合(读取或者修改),这样会造成数据的丢失,是不安全的。线程不同步就是在方法中加入synchronized,这是线程安全的,但会有额外的资源消耗
回复 使用道具 举报
回复 使用道具 举报
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。
  
例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo
对象上的数据。

public class Foo {

        private int x = 100;

        public int getX() {

                return x;
        }

        public int fix(int y) {
                x = x - y;

                return x;
        }
}

public class MyRunnable implements Runnable {

        private Foo foo = new Foo();

        public static void main(String[] args) {
                MyRunnable r = new MyRunnable();
                Thread ta = new Thread(r, "Thread-A");
                Thread tb = new Thread(r, "Thread-B");
                ta.start();
                tb.start();
        }

        public void run() {
                for (int i = 0; i < 3; i++) {
                        this.fix(30);
                        try {
                                Thread.sleep(1);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()
                                        + ": 当前foo对象的x值= " + foo.getX());
                }
        }

        public int fix(int y) {
                return foo.fix(y);
        }
}


运行结果:
        运行结果:Thread-A : 当前foo对象的x值= 40
                          Thread-B : 当前foo对象的x值= 40
                          Thread-B : 当前foo对象的x值= -20  
                          Thread-A : 当前foo对象的x值= -50  
                          Thread-A : 当前foo对象的x值= -80  
                          Thread-B : 当前foo对象的x值= -80

                        Process finished with exit code 0

从结果发现,这样的输出值明显是不合理的。原因是两个线程不加控制的访问
Foo对象并修改其数据所致。

如果要保持结果的合理性,只需要达到一个目的,就是将对Foo的访问加以限制,
每次只能有一个线程在访问。这样就能保证Foo对象中数据的合理性了。

在具体的Java代码中需要完成一下两个操作:

把竞争访问的资源类Foo变量x标识为private;同步哪些修改变量
的代码,使用synchronized关键字同步方法或代码。



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马