Java多线程-线程的同步(同步代码块)
对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。
追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。
在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。
package cn.thread; /**
* 线程同步方法
*
* @author 林计钦
* @version 1.0 2013-7-24 上午10:12:47
*/
public class ThreadSynchronizedCode {
public static void main(String[] args) {
ThreadSynchronizedCode t = new ThreadSynchronizedCode();
User u = t.new User("张三", 100);
MyThread t1 = t.new MyThread("线程A", u, 20);
MyThread t2 = t.new MyThread("线程B", u, -60);
MyThread t3 = t.new MyThread("线程C", u, -80);
MyThread t4 = t.new MyThread("线程D", u, -30);
MyThread t5 = t.new MyThread("线程E", u, 32);
MyThread t6 = t.new MyThread("线程F", u, 21); t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
} class MyThread extends Thread {
private User u;
/**存款金额*/
private int y = 0; MyThread(String name, User u, int y) {
super(name);
this.u = u;
this.y = y;
} public void run() {
u.oper(y);
}
} class User {
/** 账号 */
private String code;
/** 余额 */
private int cash; User(String code, int cash) {
this.code = code;
this.cash = cash;
} public String getCode() {
return code;
} public void setCode(String code) {
this.code = code;
} /**
* 存款
*
* @param x 欲存款金额
*
*/
public void oper(int x) {
try {
Thread.sleep(10L);
synchronized (this) {
this.cash += x;
System.out.println("线程" + Thread.currentThread().getName() + "运行结束,增加“" + x
+ "”,当前用户账户余额为:" + cash);
}
Thread.sleep(10L);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
public String toString() {
return "User{" + "code='" + code + '\'' + ", cash=" + cash + '}';
}
}
}
线程线程B运行结束,增加“-60”,当前用户账户余额为:40
线程线程A运行结束,增加“20”,当前用户账户余额为:60
线程线程C运行结束,增加“-80”,当前用户账户余额为:-20
线程线程D运行结束,增加“-30”,当前用户账户余额为:-50
线程线程F运行结束,增加“21”,当前用户账户余额为:-29
线程线程E运行结束,增加“32”,当前用户账户余额为:3
Java多线程-线程的同步(同步代码块)的更多相关文章
- Java多线程——线程之间的同步
Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...
- Java多线程6:Synchronized锁代码块(this和任意对象)
一.Synchronized(this)锁代码块 用关键字synchronized修饰方法在有些情况下是有弊端的,若是执行该方法所需的时间比较长,线程1执行该方法的时候,线程2就必须等待.这种情况下就 ...
- Java多线程——线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- Java多线程-线程的同步(同步方法)
线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...
- 什么是java的线程安全?同步,异步
线程是比进程更小的执行单位,是在进程基础上进行的进一步划分.所谓多线程是指进程在执行过程中可以产生多个同时存在.同时运行的线程.多进程机制可以合理利用资源,提高程序的运行效率.一个进程至少包含一个线程 ...
- Linux 多线程 - 线程异步与同步机制
Linux 多线程 - 线程异步与同步机制 I. 同步机制 线程间的同步机制主要包括三个: 互斥锁:以排他的方式,防止共享资源被并发访问:互斥锁为二元变量, 状态为0-开锁.1-上锁;开锁必须由上锁的 ...
- Java多线程-----线程安全及解决机制
1.什么是线程安全问题? 从某个线程开始访问到访问结束的整个过程,如果有一个访问对象被其他线程修改,那么对于当前线程而言就发生了线程安全问题: 如果在整个访问过程中,无一对象被其他线程修改,就是线程安 ...
- Java多线程--线程及相关的Java API
Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...
- Java多线程——线程之间的协作
Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...
- Java多线程——线程间通信
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
随机推荐
- ViewPager实现图片轮翻效果
很多App都有这种效果,特别一些电商类的App,顶部每隔几秒钟会向右翻页显示下张图片,用来作推广或者内容展示用的.今天来简单地模仿一下,还自带一个自动跳动的小功能(底部有几个小点,图片移动的时候,点的 ...
- 小晚wan的公众号
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/70932630 本文出自[我是干勾鱼的博客] 小晚wan的公众号还是挺深刻的,有时 ...
- 深入理解UE4宏定义—— GENERATED_BODY
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/72834164 作者:car ...
- php语法笔记
1. php中设置页面的编码方式: header(“content-type:text/html;charset=utf-8”); 2. 数据类型 布尔类型:Boolean/bool:true.f ...
- E: Could not get lock /var/lib/dpkg/lock解决
ubuntu常见错误--Could not get lock /var/lib/dpkg/lock解决 通过终端安装或卸载程序sudo apt-get install/autoremove xxx时出 ...
- HDU - 6185 :Covering(矩阵乘法&状态压缩)
Bob's school has a big playground, boys and girls always play games here after school. To protect bo ...
- HihoCoder 1068 RMQ-ST算法+BIT
以前都是用的BIT或者线段树(前者多一些). 对于ST(Sparse Table),在求倍增or公共祖先(LCA)时见过,说明还有其他用处,所以还是学习一下. 首先是预处理,用动态规划(DP)解决. ...
- yarn 管理nextjs 项目
预备环境 nodejs npm 1. yarn 安装 npm install -g yarn 2. nextjs 项目初始化 yarn add next react react-dom 3. 配置n ...
- 安装nagios-plugins插件make时遇到的error
安装nagios-plugins插件make时遇到的error error内容: check_http.c: In function ‘process_arguments’: check_http.c ...
- 把OnDraw和OnPaint弄清楚(转贴)
OnDraw()和OnPaint()兄弟 经常有朋友问雷神这样的问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同? 雷神 ...