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指的是当前实例对象