在多个线程操作同一个数据的时候,那么在执行过程中可能 不同的线程间彼此产生干扰。针对这种情况,提出了锁的机制。锁的机制就是指对于多线程使用访问同一块代码时,对该代码块进行相应的限制,限制这块代码块在同一时间只能允许一个线程对其访问。当一个线程访问使用完后释放该资源,才允许另一个线程进对其行访问和使用。实现这样锁机制的方法有三种。其一就是使用关键字Synchronized。
在方法上添加关键字
public class Usesychornized {
public static void main(String[] args) {
ExecutorService service=Executors.newCachedThreadPool();
qiangpiao qiangpiao=new qiangpiao();
service.submit(qiangpiao);
service.submit(qiangpiao);
}
}
class qiangpiao implements Runnable{
private int num=50;
private boolean flag=true;
@Override
public void run() {
while(flag) {
test();
}
}
//a b c
public synchronized void test() {
if(num<=0) {
flag=false;
return;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"===="+num--);
}
}
像是a,b,c三个均进入了上了锁的方法,只有当a执行完,b才能执行,之后c才能执行。这样就不会产生干扰。
2使用Sychronized锁一段代码块。
public void test1() {
synchronized(this) {
if(num<=0) {
flag=false;
return;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"===="+num--);
}
}
3如果是静态方法我们需要使用的是锁该对象的class。
public static void test1() {
synchronized(this.class) {
if(num<=0) {
flag=false;
return;
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"===="+num--);
}
}
对于Synchronized代码块这部分,我们需要传入的是同一个对象就能够使用。其实现原理是:每一个对象都有一个锁,线程可以通过调用同步方法获得这个锁。只要有一个线程获得该锁,另一个线程就需要等待上一个线程释放锁才能往下运行。