多线程并发操作同一个资源
同步锁: 多线程操作的锁必须唯一
必须搞清楚:哪些代码需要同步?
那些在操作共享资源的代码,只要包含非读的操作,或者根据共享资源进行条件判断的,就需要同步!
同步代码块解决
package com.gc.thread;
/**
* 多线程操作共享资源---并发---线程安全问题---同步---锁---相对而言性能下降,但可接受
* 通过Runnable(的子类)封装共享资源
* 线程可能在run()中代码的任意位置被阻塞
* 控制线程的准入条件非常关键 --->同一把锁
*
* 涉及多线程并发,必须注意2点
* 1.多个线程操作同一个资源
* 2.使用同一个锁
*/
public class MutilThread implements Runnable {
//共享的资源
private int num = 1000;
//唯一的锁
Object mutex = new Object();
@Override
public 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();
}
}