java 数组转字符串????回答主要是三个方面:(1)ha(3)
(2)不管多个线程是怎样的执行顺序和优先级,或是wait,sleep,join等控制方式。 如果一个类在多个线程访问下运转一切正常,并且访问类不需要进行额外的同步处理或协调,那么我们认为它是线程安全的。
如何保证线程安全?
(1)对变量使用volatile
(2)对程序段进行加锁(synchronized,lock)
注意:
非线程安全的集合在多线程环境下可以使用,但并不能作为多个线程共享的属性,可以作为某个线程独立的属性。例如:Vector是线程安全的,ArrayList不是线程安全的,如果每一个线程new一个ArrayList,而这个ArrayList在这个线程中使用肯定没有问题。(若再new一个ArrayList,就会线程不安全)
1、采用object方法:wait(), notify(), notifyAll();
2、在java 1.5中采用condition,比传统的wait,notify()更加安全高效
3、采用生产者—-消费者模式(采用队列的形式)
生产者发布消息在队列中,消费者从队列中取任务去执行。
出现的问题:当我们在线程对象(Runnable)中定义了全局变量,run方法修改该变量时,如果有多个线程同时使用该线程对象,那么就会造成全局变量的值被同时修改,造成错误。
解决方法1:ThreadLocal是JDK引入的一种机制,它用于解决线程共享变量,使用ThreadLocal声明的变量,会在每个线程内产生一个变量副本,从而解决了线程不安全。
解决方法2:volatile变量每次被线程访问时,都强迫线程从主内存中重新取该变量的最新值到工作内存中,而当该变量发生修改变化时,也会强迫线程将最新的值刷新会到主内存中。这样一来,不同的线程都能及时的看到该变量的最新值。
什么是线程池?
线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建(类似于工厂设计模式),使用完毕不需要销毁线程而是返回池中,从而减少创建和销毁线程对象的开销。
设计一个动态大小的线程池,如何设计,应该有哪些方法??
一个线程池包括以下四个基本单位:
(1)线程管理器(ThreadPool):用于创建并管理线程池,包括创建线程,销毁线程池,添加新任务;
(2)工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;
(3)任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定任务的入口,任务执行完成后的收尾工作,任务的执行状态等。
(4)任务队列(TaskQueue):用于存放没有处理的任务,提供一种缓冲机制。
所包含的方法:
(1)private ThreadPool()创建线程池;
(2)Public static ThreadPool getThreadPool()获得一个默认线程个数的线程池;
(3)Public void execute(Runnable task)执行任务,其实只是把任务加入任务队列,什么时候执行由线程池管理器确定;
(4)Public void execute(Runnable[] task) 批量执行任务,其实只是把任务加入任务队列,什么时候执行由线程管理器确定。
(5)Public void destroy() 销毁线程池,该方法保证所有任务都完成的情况下才销毁所有线程,否则等待任务完成销毁。
(6)Public int getWorkThreadNumber() 返回工作线程的个数。
(7)Public int getFinishedTasknumber()返回已完成任务的个数,这里的已完成是指出了任务队列的任务个数,可能该任务并没有实际执行完成。
舰艇再多管比用