4,临界区 之 synchronized
2015-03-18 14:01
78 查看
前提背景:多个并发线程共享同一个资源时,为防止这些共享资源可能出现的错误或数据不一致问题,提出了临界区的概念
临界区: 指一个用以访问共享资源的代码块,这个代码块在同一时间内只能允许一个线程访问
实现方式:synchronized 或 lock
synchronized 方式如下, User 给addMoney方法加上了synchronized , 相当于加了锁,后面同时起了3个线程,都调这个方法,因为设置了sleep 3 秒,可以看到 会有2个线程处于 BLOCKED 的状态,直到释放
结果如下
临界区: 指一个用以访问共享资源的代码块,这个代码块在同一时间内只能允许一个线程访问
实现方式:synchronized 或 lock
synchronized 方式如下, User 给addMoney方法加上了synchronized , 相当于加了锁,后面同时起了3个线程,都调这个方法,因为设置了sleep 3 秒,可以看到 会有2个线程处于 BLOCKED 的状态,直到释放
package com.zyguo.thread; public class User { private int money; private int id; public User( int id ){ this.setId(id); } public int getMoney() { return money; } public synchronized int addMoney( int incrNum ){ this.money = this.money + incrNum; try { Thread.sleep( 3000 ); System.out.println("addMoney, currThread=" + Thread.currentThread() ); } catch (InterruptedException e) { e.printStackTrace(); } return this.money; } public synchronized int reducMoney( int reducNum ){ this.money = this.money - reducNum; return this.money; } public int getId() { return id; } public void setId(int id) { this.id = id; } }
package com.zyguo.thread; import java.util.ArrayList; public class Main_synchronized { public static void main(String[] args) { final User u = new User(1); int threadNum = 3; final ThreadGroup tgroup = new ThreadGroup("test-threadgroup"); final ArrayList<Thread> tList = new ArrayList<>(); //定义10个线程 for( int i = 0; i < threadNum; i++ ){ Thread t = new Thread( tgroup, new Runnable() { @Override public void run() { u.addMoney(1); } } ,"test-thread-" + i); tList.add( t ); t.start(); System.out.println("start thread = " + t ); } //监控线程的活动的子线程数 Thread t = new Thread( new Runnable() { @Override public void run() { int activeCount = tgroup.activeCount(); while ( activeCount > 0 ) { for (Thread thread : tList) { System.out.println( thread + ",state=" + thread.getState() ); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } activeCount = tgroup.activeCount(); } } }); t.start(); } }
结果如下
start thread = Thread[test-thread-0,5,test-threadgroup] start thread = Thread[test-thread-1,5,test-threadgroup] start thread = Thread[test-thread-2,5,test-threadgroup] Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-1,5,test-threadgroup],state=BLOCKED Thread[test-thread-2,5,test-threadgroup],state=BLOCKED Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-1,5,test-threadgroup],state=BLOCKED Thread[test-thread-2,5,test-threadgroup],state=BLOCKED Thread[test-thread-0,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-1,5,test-threadgroup],state=BLOCKED Thread[test-thread-2,5,test-threadgroup],state=BLOCKED addMoney, currThread=Thread[test-thread-0,5,test-threadgroup] Thread[test-thread-0,5,],state=TERMINATED Thread[test-thread-1,5,test-threadgroup],state=BLOCKED Thread[test-thread-2,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-0,5,],state=TERMINATED Thread[test-thread-1,5,test-threadgroup],state=BLOCKED Thread[test-thread-2,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-0,5,],state=TERMINATED Thread[test-thread-1,5,test-threadgroup],state=BLOCKED Thread[test-thread-2,5,test-threadgroup],state=TIMED_WAITING addMoney, currThread=Thread[test-thread-2,5,test-threadgroup] Thread[test-thread-0,5,],state=TERMINATED Thread[test-thread-1,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-2,5,],state=TERMINATED Thread[test-thread-0,5,],state=TERMINATED Thread[test-thread-1,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-2,5,],state=TERMINATED Thread[test-thread-0,5,],state=TERMINATED Thread[test-thread-1,5,test-threadgroup],state=TIMED_WAITING Thread[test-thread-2,5,],state=TERMINATED addMoney, currThread=Thread[test-thread-1,5,test-threadgroup]
相关文章推荐
- 【Java】利用synchronized(this)完成线程的临界区
- 从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
- java的synchronized的使用场景简介以及在不同场景下的差异
- Java线程及同步(synchronized)样例代码
- synchronized关键字
- windows多线程-关键代码段(临界区)(sunxin vc++ 笔记4)
- 一道面试题比较synchronized和读写锁
- 当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
- Java多线程 之 访问共享资源synchronized、lock(七)
- synchronized
- Java多线程编程中synchronized关键字的基础用法讲解
- synchronized——java同步关键字
- volatile关键字和synchronized关键字
- 对synchronized(this)的一些理解
- 临界区,互斥量,信号量,事件的区别
- synchronized和native关键字的使用方法
- java synchronized的使用
- 线程访问临界区的问题 实例,需解决
- Java中Synchronized的用法
- java---synchronized同步机制