(多线程)多线程的并发安全
?
多线程并发操作同一个资源
?
同步锁: 多线程操作的锁必须唯一
?
必须搞清楚:哪些代码需要同步?
那些在操作共享资源的代码,只要包含非读的操作,或者根据共享资源进行条件判断的,就需要同步!
?
同步代码块解决
?
package com.gc.thread;/** * 多线程操作共享资源---并发---线程安全问题---同步---锁---相对而言性能下降,但可接受 * 通过Runnable(的子类)封装共享资源 * 线程可能在run()中代码的任意位置被阻塞 * 控制线程的准入条件非常关键 --->同一把锁 * * 涉及多线程并发,必须注意2点 * 1.多个线程操作同一个资源 * 2.使用同一个锁 */public class MutilThread implements Runnable {//共享的资源private int num = 1000;//唯一的锁Object mutex = new Object();@Overridepublic void run() {while(true) {//锁只要没释放,其它线程就无法进入--弊端:消耗资源//synchronized (this) {synchronized (mutex) {try {if(num<=0)break;doJob();} catch (InterruptedException e) {e.printStackTrace();}}}}public void doJob() throws InterruptedException {Thread.sleep(10);System.out.println(Thread.currentThread().getName()+"--->"+ (num--));}}
?
开启多线程,操作共享资源num
package com.gc.thread;public class Demo {public static void main(String[] args) {MutilThread runnable = new MutilThread();//传入同一个Runnable接口子类对象,让多线程操作Runnable中封装的共享资源Thread a = new Thread(runnable);Thread b = new Thread(runnable);Thread c = new Thread(runnable);Thread d = new Thread(runnable);//开启线程 【注意:一个线程只能调用1次start(),多次调用将抛"线程运行状态异常"】a.start();b.start();c.start();d.start();}}
?