java线程中数据同步-synchronized
作者:binsynchronized字段可以让部分代码,或者方法,在多个线程都要执行时,串行执行
package com.zengbingo.chapter4;
import java.util.concurrent.TimeUnit;
/**
* 使用synchronized字段让部分代码或者方法串行执行
*/
public class ThreadData implements Runnable{
private int index = 1;
private final static int MAX = 50000;
private final static Object MUTEX = new Object();
@Override
public void run(){
System.out.println(Thread.currentThread().getName() + "-窗口,开始获取号码:");
while (index < MAX) {
//代码块串行
synchronized (MUTEX){
System.out.println(Thread.currentThread().getName() + "-窗口,号码:" + index ++ );
}
//方法串行
//puls();
//让线程忙碌任意时间
try {
TimeUnit.MILLISECONDS.sleep((int)(Math.random()*100));
}catch (Exception e){
}
}
}
/**
* 使用synchronized标注串行代码
*/
private synchronized void puls(){
System.out.println(Thread.currentThread().getName() + "-窗口,号码:" + index ++ );
}
}
相关锁:java线程中数据同步-lock
synchronized的实现原理:
sync的锁标识位是放在java对象头中的,所以如果锁的是静态方法,或者类本身,那么多个实例对象都会的阻塞
例如如下方法:
public synchronized static void demo(){}
synchronized (Demo.class){}
如果也可以对实例进行锁,这样不同的对象锁的就不同:
A a = new A();
synchronized (a){}
synchronized (this){} //this指的是当前实例对象