在编写多线程的时候,必须要注意资源的使用问题,如果两个或多个线程分别拥有不同的资源,
而同时又需要对方释放资源才能继续运行时,就会发生死锁。
public class DeadLockThead extends Thread{ //简单来说:死锁就是当一个或多个进程都在等待系统资源,而资源本身又被占用时,所产生的一种状态。 // 造成死锁的原因: // 多个线程竞争共享资源,由于资源被占用,资源不足或进程推进顺序不当等原因造成线程处于永久阻塞状态,从而引发死锁 Object objectA=new Object(); Object objectB=new Object(); public static final int ObjectA=1; public static final int ObjectB=2; public int type; public DeadLockThead(int type){ this.type=type; } @Override public void run() { super.run(); if (type==ObjectA){ System.out.println(Thread.currentThread()); synchronized (objectA){ System.out.println("执行objectA的方法"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (objectB){ System.out.println("执行objectB方法"); } } }else if (type==ObjectB){ System.out.println(Thread.currentThread()); synchronized (objectB){ System.out.println("执行objectB方法"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (objectA){ System.out.println("执行objectA的方法"); } } } } }
public void test(){ DeadLockThead deadLockTheadA=new DeadLockThead(DeadLockThead.ObjectA); DeadLockThead deadLockTheadB=new DeadLockThead(DeadLockThead.ObjectB); deadLockTheadA.start(); deadLockTheadB.start(); }
线程池
/** * 线程池 就是管理线程的工具 可以统一管理线程的创建和销毁 */ public void test(){ ExecutorService executorService= Executors.newFixedThreadPool(3); executorService.submit(runnable1); executorService.submit(runnable2); executorService.submit(runnable3); executorService.submit(runnable4); } Runnable runnable1=new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()+"任务1的方法"); } }; Runnable runnable2=new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()+"任务2的方法"); } }; Runnable runnable3=new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()+"任务3的方法"); } }; Runnable runnable4=new Runnable() { @Override public void run() { System.out.println(Thread.currentThread()+"任务4的方法"); } };
/** * 非线程安全是指多线程操作同一个资源可能会出现问题。而线程安全则是多线程操作同一个资源不会有问题 * 原理就是同一时间不能有两个线程操作同一个资源 */ public class ThreadSafe { private int count; public void test(){ for (int i = 0; i < 1000; i++) { new Thread(runnable).start(); } } Runnable runnable=new Runnable() { @Override public void run() { System.out.println("Thread="+Thread.currentThread()); for (int i=0;i<1000;i++){ addCount(); System.out.println("count="+count); } } }; /** * 解决线程安全的办法就是添加同步锁 * 通过同步锁来限制多线程访问同一个资源 */ private synchronized void addCount() { count++; } }