首页 > java线程 > java线程中数据同步-synchronized

java线程中数据同步-synchronized

作者:bin

synchronized字段可以让部分代码,或者方法,在多个线程都要执行时,串行执行

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

您必须 [ 登录 ] 才能发表留言!