多线程就是有多个线程同时运行。
线程的生成
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
多线程有共用的资源就需要同步(例如,变量,列表);没有共用资源不需要同步。
同步需要使用锁。
锁与锁上的条件(条件wait时会释放该锁,条件notify时会唤醒,条件wait的线程,并且从wait后一句开始执行)。
1.synchronized(是生成锁的工具)
任何对象可作为锁和该锁的条件(锁和锁的条件必须同一对象)
synchronized fun(){} 对函数加锁,锁是this。该类某个对象内互诉,可以使用wait和notify。这个锁上条件也是this
synchronized(this){} 对代码块加锁,锁是this。该类某个对象内互诉,可以使用wait和notify。这个锁上条件也是this
synchronized(xx.class){}对代码块加锁,锁是该类,该类的所用对象互诉。
2.Lock(使用更灵活可以,trylock)
ReadWriteLock(读写锁,应对写写互诉,读写互斥,读读不互斥。(实现方法可以是,第一个读者进入加写锁,最后的读者出释放写锁))
锁(Lock lock=new ReentrantLock())和锁的条件( Condition conditionA=lock.newCondition();),一个锁可以有多个该锁的条件。(锁和锁上的条件必须一致)。
lock.lock();(lock.trylock()(如果能获得锁就获得返回true,如果不能获得就返回false不阻塞))
lock.unlock();
ReadWriteLock lock = new ReentrantReadWriteLock();
Lock read = lock.readLock();
Lock write = lock.writeLock();
read.lock();
list.get(i);
read.unlock();
write.lock();
list.add("dd",i);
write.unlock();
3.semaphore(信号量)(实现方法可以是,加锁保护一个整数变量)
Semaphore semaphore = new Semaphore(1);(参数代表资源数量,为1时可以当作锁来用),(也可以代表允许多少个线程访问某个资源)
semaphore.acquire();(如果还有资源,资源减少一个,如果没有则阻塞)
semaphore.release();(释放一个资源)
同步模式(线程之间协同关系)
1.普通加锁模型(共享的变量都加锁)
2.生产者消费者模型
生产者不断生产产品加入到缓冲区,如果缓冲区满则阻塞。消费者不断地从缓冲区取产品消费,如果缓冲区空则阻塞。
3.读者写者模型
例如。对一个列表读读可以并发。读写不并发,写写不并发。这样可以提高效率。
4.哲学家进餐模型。
在一个饭桌上一个人只能拿起左右两者筷子才能进餐。要防止死锁(例如都同时拿起了左侧的筷子则会死锁)。
可以这样解决,奇数的人,先拿左侧,偶数的人先拿右侧。则不会死锁。
死锁:就是线程相互等待,都不能运行。( 是指两个或两个以上的进程在执行过程中,由于竞争资源彼阻塞的现象)
1.资源使用互斥
2.不释放,且请求。
3.不剥夺。
4.循环等待。
解决方式:打破人一个条件。(例如,打破循环等待:A B两把锁,让加锁顺序一致。)
相关推荐
基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...
c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程c_多线程...
Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
在计算机处理器发展为包含越来越多的核心的时期,多线程是创建可伸缩性、高效的、高响应性应用程序的关键因素。如果你没有正确地使用多线程,它会导致难以捉摸的问题,需要你花费大量时间去解决。因此,现代应用程序...
最近用多线程用的比较多自己走了一些弯路,分享出来希望大家少走弯路,C#中的多线程有两个重载,一个是不带参数的,一个是带参数的,但是即便是带参数的多线程也不支持泛型,这使得使用泛型参数多线程的时候很不方便...
Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)Win32多线程程序设计.pdf(带目录)...
c语言多进程多线程编程
串口通信的实现,编程环境为C#,实现技术采用了多线程方式
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
c#大漠多线程模板
Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示到主线程的Label控件上 模拟了一个16个摄像机的场景,有不开多线程和打开多线程的对比。 可以明显感觉到打开多线程后主界面不卡了。 ...
Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...
C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行
多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程多线程
是多线程的测试,对学习多线程的朋友有用,使用C#2008来编写的,需要的朋友可以去下载
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
excel vba 多线程 实例 excel vba 多线程 实例
简单多线程编程入门,可以帮助你实现第一个多线程程序
最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....