Java7线程学习笔记(二)

线程局部变量的使用:
线程局部变量分别为每个线程存储了各自的属性值,并提供给每个线程使用。你可以使用get()方法读取这个值,并用set()方法设置这个值。如果线程是第一次访问局部变量,线程局部变量可能还没有为他存储值,这个时候initialValue()方法被调用,并且返回当前的值。

private static ThreadLocal<Date> startDate= new ThreadLocal<Date>() {
        protected Date initialValue(){
            return new Date();
        }
    };

public class ThreadLocalextends Object 该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联。
线程的分组:
Java提供ThreadGroup类表示一组线程。线程组可以包含线程对象,也可以包含其他的线程组对象,他是一个树形结构。
使用工厂类创建线程:
Java 提供了ThreadFactory接口,这个接口实现了线程对象工厂。
ThreadFactory接口只有一个方法,即newThread,它以Runnable接口对象作为传入参数并且返回一个线程对象。当实现ThreadFactory接口时,必须实现覆盖这个方法,return new Thread(r)
多线程同步:
临界区:临界区是一个用以访问共享资源的代码块,这个代码块在同一个时间内只允许一个线程执行。
为了帮助编程人员实现这个临界区,Java提供了同步机制,当一个线程试图访问一个临界区时,它将使用一种同步机制来查看是不是已经有其他线程进入临界区。,如果已经有线程进入临界区,它就被同步机制挂起,直到进入的线程离开这个临界区。
使用synchronized实现同步方法:
如果一个对象已被synchronized关键字声明,那么只有一个执行线程被允许访问它。即每一个用synchronized关键字声明的方法都是临界区,在Java中,同一个对象的临界区在同一时间只有一个允许被访问。
静态方法则有不同的行为。用synchronized关键字声明的静态方法,同时只能够被一个执行线程访问,但是其他线程可以访问这个对象的非静态方法。
Synchronized关键字会降低应用程序的性能,因此只能在并发情景中需要修改共享数据的方法上使用它。
使用非依赖属性实现同步:
当使用synchronized关键字来保护代码块时,必须把对象引用作为传入参数。通常情况下,使用this关键字来引用执行方法所属的对象。
在同步代码中使用条件:
Java在Object类中提供了wait()、notity()和notityAll()方法。线程可以在同步代码块中调用wait()方法。如果在同步代码块之外调用wait()方法,JVM将抛出IllegalMonitorStateException异常。当一个线程调用wait()方法时,JVM将这个线程置入休眠,并且释放控制这个同步代码块的对象,同时允许其他线程执行这个对象控制的其他同步代码块。为了唤醒这个线程,必须在这个对象控制的某个同步代码块中调用notify()或者notifyAll()方法。
使用锁实现同步:
Java提供了同步代码块的另一种机制,它是一种比synchronized关键字更强大的也更灵活的机制。这种机制基于Lock接口及其实现类。
Lock接口允许分离读和写操作,允许多个读线程和只有一个写线程。
相比synchronized关键字,lock接口有更好的性能。
使用读写锁实现同步数据访问:
锁机制最大的改进之一就是ReadWriteLock接口和它的唯一实现类ReentrantReadWriteLock.这个类有两个锁,一个是读操作锁,另一个是写操作锁。使用读操作锁可以允许多个线程同时访问,但是使用写操作锁时只允许一个线程进行。在一个线程执行写操作时,其他线程不能够执行读操作。
修改锁的公平性:
ReentrantLock和ReentrantrReadWriteLock类的构造器都含有一个布尔参数fair,它允许你控制这两个类的行为,默认fair值是false,它称为非公平模式,在非公平模式下,当有很多线程在等待锁时,锁将选择他们中的一个来访问临时区,这个选择是没有任何约束的。如果fair值是true,折称为公平模式。在公平模式下,当有很多线程在等待锁时,锁将选择他们中的一个来访问临界区,而且选择的是等待时间最长的。这两种模式只使用于lock()和unlock()方法.
在锁中使用多条件:
一个锁中可能关联一个或者多个条件,这些条件通过Condition接口声明。目的是允许线程获取锁并且查看等待的某一个条件是否满足,如果不满足就挂起直到某个线程唤醒他们。Condition接口提供了挂起线程和唤起线程的机制。

你可能感兴趣的:(java,java,线程,7)