/** * 1.如何同时启动两个线程 * 程序的启动就是两个线程的同时启动 * 2.让同时启动的线程如何按照一定的顺序执行 * 两个线程按照一定的顺序执行:说明的是满足某个条件的运行即:多线程协调之间的通信这样用到的通信的工具类就是有 * countDownLatch,cycBarier,Condition,ReenTLock等等的操作 * 我们经常说线程安全性,与其说是线程安全性不如说是数据安全性,这里所谓的数据安全性就是指的是数据的一致性, * 即:原子类,volatitle,synchronized,以及一些线程安全类的使用,用这些的目的主要有以下几点: * 1.明确一个概念: * 可以这样的理解:java进程就是一个主内存,也就是计算机本身的内存(虽然二者并不是一回事,但是可以这么理解) * java多线程就是多核cpu,就是多个处理器(方便理解)这样每个线程本身就有自己的缓存区,但是这样的缓存区的数据 * 是从哪来的呢? * 那么问题来了: * 这样的数据就是从主内存来的,也就是说,主内存对于多线程来说是线程共享的,也就是说主内存中的数据是共享的,那么这样 * 的话怎么保存数据的一致性呢?也就是说如何保证数据实时的从线程本地的缓存,通过当前的线程的修改及时的write到 * 主内存呢? * 主要方案如下: * 1.多线程工具类:countDownLatch,cycBarier,信号量 * 2.原子类: * 3.synchrozized * 4.reenTrentLock * 5.volititle * * 3.线程可以分为:隐式线程和显式线程 * 何为隐式线程? * 即:一个java程序的启动,本身自带main线程和垃圾线程,这些线程是不需要你去启动的你也感觉不到,但他本是 * 就是存在的 * 何为显式线程? * 即:实现线程的方式: * 1.常用的线程方式,这个就不多说了,直接去查资料或者(java多线程一书当中关于线程总结的很详细) * 2.线程池:这里主要明确一下几个参数的意义: * 核心线程数:就是当前线程本身应该有的,骨干力量 * 最大线程数:这个我想和队列一起说为什么这样说呢? * 3.队列 因为队列中所能容纳的就是最大线程数,当超过最大线程数的时候,那么线程池的剩余一个参数就起作用 * 4. 拒绝策略 * 4.常见的应用: * Future ,FutureTask,CallAble结合线程池使用; * 5.通过源码发现: * 启动线程Start方法,这个方法是线程安全的?为什么,因为用Synchronized关键字修饰,并且他最终调用的是 * Start0()方法,而这个方法是用native关键字修饰的,底层就是关于c语言的说明,不在研究 */ public class Test { /** * 读写锁 */ private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); public static void main(String[] args) { new Thread() { }.start(); } public void get(Thread thread) { rwl.readLock().lock(); try { long start = System.currentTimeMillis(); while (System.currentTimeMillis() - start <= 1) { System.out.println(thread.getName() + "正在进行读操作"); } System.out.println(thread.getName() + "读操作完毕"); } finally { rwl.readLock().unlock(); } } }
多线程-理解
猜你喜欢
转载自blog.csdn.net/wb_zjp283121/article/details/89448181
今日推荐
周排行