码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法

时间:2016-09-27 19:14:11      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

多线程同时对资源进行访问时,同步机制使得同一时间内只能有一个线程对资源进行操作。

同步机制可以用Synchronized实现。

当Synchronized修饰一个方法的时候,该方法称为同步方法。

当Synchronized方法执行完成或者异常时会释放锁。

会有同学对synchronized修饰方法,静态方法,对象时具体对哪些东西加锁不是很明白,这里会进行详细的讲解。

  • synchronized修饰方法时,会对类实例进行加锁,该实例的所有synchronized方法必须等当前锁释放后才能访问。
  • synchronized修饰静态方法时,会对类对象上锁,改类的其他实例的的synchronized方法必须等当前锁释放后才能访问。
  • synchronized修饰对象时,会对对象上锁,其他使用该对象的synchronized方法必须等当前锁释放才能访问。

不使用synchronized修饰方法时

代码设计中一共使用到了三个类。

Example类是公共资源,会有多个线程访问。

本案例中有两个线程访问。

class Example {

    public void exec() {
        for (int i = 0; i < 10; i++) {
            try {
                long time = (long) (Math.random() * 1000);
                Thread.sleep(time);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }

            System.out.printf("%s,Hello[%d]\n", Thread.currentThread().getName(), i);
        }

    }
}

MyThread类是线程类,用于访问Example公共资源。

class MyThread extends Thread {
    private final Example example;

    public MyThread(Example example) {
        this.example = example;
    }

    @Override
    public void run() {
        example.exec();
    }
}

TestSynchronized是主类,用于new 线程并启动。

public class TestSynchronized {
    public static void main(String[] args) {
        Example example = new Example();
        MyThread thread1 = new MyThread(example);
        MyThread thread2 = new MyThread(example);
        thread1.start();
        thread2.start();
    }
}

由于现在的Example类的方法没有使用同步方法,所以两个线程会同时访问该方法,打印的值也是无序的,如下:

 

技术分享

使用Synchronized修饰方法时

我们需要修改Example这个公共资源的方法。

class Example {

    public synchronized void exec() {
        for (int i = 0; i < 10; i++) {
            try {
                long time = (long) (Math.random() * 1000);
                Thread.sleep(time);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }

            System.out.printf("%s,Hello[%d]\n", Thread.currentThread().getName(), i);
        }

    }
}

对于exec方法加上synchronized关键字,该方法同时只能有一个线程访问。

技术分享

JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法

标签:

原文地址:http://www.cnblogs.com/jiejiecool/p/5913793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!