首页 > 代码库 > JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法
JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法
多线程同时对资源进行访问时,同步机制使得同一时间内只能有一个线程对资源进行操作。
同步机制可以用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同步代码块具体使用方法
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。