小白学习java第11天(下):多线程详解
1.线程同步*(重点)【由于同一进程的2多个线程共享同一快存储空间,在带来方便的同时,也带来了访问冲突的问题,为了保证数据在方法中被访问的正确性,在访问加入锁机制synchronized,当一个线程对象获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可,但是存在一下问题就是:
1.一个线程持有锁会导致其他所需要此锁的线程挂起
2.在多线程竞争,加锁,释放锁会导致比较多的上下文切换和调度延时引起的性能问题
3.比如优先级高的等优先级低的释放锁,就会导致优先级倒置,引起性能问题,【安全和性能不能兼得】】
并发,多个线程执行同一个对象!处理多线程问题时,多线程访问同一个对象,并且某些线程还想修改这个对象,这个时候我们就需要线程同步,线程同步其实是一种等待机制,多个需要同时访问此对象的线程进入这个对象等待池形成队列,等待前面线程使用完毕,下一个线程在使用。
上述就出现这个问题,怎么感觉一个对象被多个使用呢,(那么这就出现一个类似于这样:你存在银行500,你去取了500,你对象也去取了500,那这样银行不是亏死了!,所以我们要保证就是类似于等待状态!你弄完我才开始弄)
下面就对其进行原理分析图:
(注意这里有个小细节,就是你CPU给每个线程都是分配时间的,如果你的操作不需要很复杂,那么在第一个进去的时候可能就把对象解决了(票取完了))
因此我需要在方法里面进行sleep一下,久一点嘛这样就不至于在CPU给他分配的时间内,就已经处理完事情了
死锁:某个同步块同时有“两个及其以上的对象锁”,就有可能发生“死锁”问题
那么解决办法也很简单,就是你要去拿别人的锁!!!
因此如何避免死锁:
1.一个资源只能被一个进程使用(一夫一妻)
2.一个进程因请求资源而堵塞时,对方获得资源保持不放(遇到困难,仍然坚定忠诚)
2.进程已获得资源,在未使用之前,不能强行剥夺(法律保护,不能强抢民女)
3.若干进程之间形成一种头尾相接的循环等待资源关系(离了婚才能在结)
2.线程池:就是经常创建和销毁,使用特别大的资源,比如并发情况下的线程,对性能影响很大,因此我们需要提前创建好多线程,放入线程池中
package demo01;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Test03 {
public static void main(String[] args) {
//创建线程池
ExecutorService service = Executors.newFixedThreadPool(10);
//添加进去
service.execute(new MyThread());
service.execute(new MyThread());
service.execute(new MyThread());
service.execute(new MyThread());
//关闭
service.shutdown();
}
}
class MyThread implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}