1.一个对象是否是安全的,不在乎这个对象实现了什么功能,而在于这个对象是否为多个线程使用。(是否说明没有共享数据的类,就是线程安全的类)也就是说,如果多个线程访问共享数据时,一个个的来,那线程就是安全的。java中关于线程关于同步(一个个来)的做法有:synchronized,volatile,显示锁,原子变量,关于这几个同步术语后面再谈。
2.面向对象思想为并发提供了有力的支持。如果设计类的时候考虑到了并发,对类中的共享数据(对象中的常量等)进行保护,对能访问变量的方法都实现正确的同步。对于共享数据的访问越少越好,一定要访问的话,也要加上合适的同步,合适二字就得根据设计场景来了,比如有时候对数据只读不访问的方法,还是可以开个后门的。(原文:当设计线程安全的类时,良好的面向对象计数,不可修改性,以及明晰的不变性规范都能起到一定的帮助作用)
3.说起不可修改性对线程安全的帮助,就得提提String这个东西,String是线程安全的,理由呢,就是它从出生之后就不改了。String的设计是有不变模式做支持的,由强不变模式做支持的类,都是线程安全类。
4.关于线程安全性的定义。原文:线程安全性最核心的定义就是正确性。正确性的含义:某个类的行为与其规范完全一致。定义:当多个线程访问某个类时,这个类始终都能表现出正确的行为,则说这个类是线程安全的。也就是说写出来的类如果能实现你的业务,并且在多线程的情况下一直不出错,就说它是线程安全的。
5.如果在封装类的时候做了必要的线程同步措施,则使用它的客户端无须进一步采取同步措施。
6.原子性:一组语句(操作)作为一个不可分割的单元被执行,则说这组语句具有原子性。
典型的代码有:a = i++,i++操作是由三个操作组成的读取i,i的值加1,将i赋值a。如果多个线程同时执行这段代码,则会出现同时读取到i的值,然后各自加1,先后赋值的情况,这时i的递增操作会出现丢失。
对于上述这种正确结果取决于线程间执行顺序的情况,有一个正式的名字:竞态条件。
7.复合操作。存在两组操作A和B,如果从执行A的线程看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。原子操作是指:对于访问同一个状态的所有操作(包括操作本身),这个操作是一个以原子方式执行的操作。
网友评论