多线程入门-第七章-线程的同步Synchronized
/*
异步编程模型:两个线程执行自己的,互不影响。 同步编程模型:t1和t2执行,t2必须等t1执行结束之后才能执行。 为什么要线程同步?
1、为了数据的安全,尽管应用程序的使用率降低,但是为了保证数据是安全的,必须加入线程同步机制。线程同步机制使程序变成了(等同于)单线程。 2、什么条件下使用线程同步?
一、必须是多线程环境
二、多线程环境共享同一个数据
三、共享的数据涉及到修改操作。
*/
public class ThreadTest06
{
public static void main(String[] a)
{
//创建一个公共的账户
Account act = new Account("no-001",5000.0); Processor p = new Processor(act); Thread t1 = new Thread(p);
Thread t2 = new Thread(p); t1.start(); t2.start(); } static class Processor implements Runnable
{
Account act; //构造方法,为了共享同一个对象
public Processor(Account act){
this.act = act;
}
public void run(){
act.withdraw(1000);
System.out.println("取款成功,余额:"+act.getBalance());
}
} static class Account
{
private String no;
private double balance; public Account(){} public Account(String no,double balance){
this.no = no;
this.balance = balance;
} public void setNo(String no){
this.no = no;
} public void setBalance(double balance){
this.balance = balance;
} public String getNo(){
return no;
} public double getBalance(){
return balance;
} //取款
public void withdraw(double money){ //吧把需要同步的代码,放到同步语句块中。
/*
原理:t1和t2线程,t1线程执行到此处,遇到了synchronized关键字,就会去找this的对象锁,
如果找到this对象锁,则进入同步语句块中执行程序。当同步语句块中的代码执行结束后,t1线程
归还this的对象锁。 在t1执行同步语句块的过程中,如果t2线程也过来执行以下代码,也遇到关键字synchronized,所以也去找
this的对象锁,但是该对象锁被t1持有,只能在这等待this对象的归还。 */
synchronized(this){
double after= balance - money; try{
Thread.sleep(1000);
}catch(Exception e){ }
this.setBalance(after);
}
}
}
}
/*
类锁
*/
public class ThreadTest06
{
public static void main(String[] a) throws Exception
{
Thread t1 = new Thread(new Processor());
Thread t2 = new Thread(new Processor()); t1.setName("t1");
t2.setName("t2"); t1.start();
//为了保证t1先执行
Thread.sleep(1000);
t2.start(); } static class Processor implements Runnable
{
public void run(){
if("t1".equals(Thread.currentThread().getName())){
MyClass.m1();
}
if("t2".equals(Thread.currentThread().getName())){
MyClass.m2();
}
}
} static class MyClass
{
//synchronized添加到静态方法上,线程执行此方法的时候会找类锁。
public synchronized static void m1(){
try{
Thread.sleep(10000);
}catch(Exception e){
}
System.out.println("m1......");
} //不会等m1结束,因为该方法没有被synchronized修饰
/*public static void m2(){
System.out.println("m2......");
}
*/ //m2会等m1结束之后才会执行,因为类锁只有一个
public synchronized static void m2(){
System.out.println("m2......");
}
}
}
/*
死锁
*/
public class DeadLock
{
public static void main(String[] args)
{
Object o1 = new Object();
Object o2 = new Object(); Thread t1 = new Thread(new T1(o1,o2)); Thread t2 = new Thread(new T2(o1,o2)); t1.start();
t2.start();
}
} class T1 implements Runnable
{
Object o1;
Object o2; T1(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
public void run(){
synchronized(o1){
try{Thread.sleep(1000);}catch(Exception e){}
synchronized(o2){ }
}
}
} class T2 implements Runnable
{
Object o1;
Object o2; T2(Object o1,Object o2){
this.o1 = o1;
this.o2 = o2;
}
public void run(){
synchronized(o2){
try{Thread.sleep(1000);}catch(Exception e){}
synchronized(o1){ }
}
}
}
多线程入门-第七章-线程的同步Synchronized的更多相关文章
- 多线程入门-第六章-线程的调度与控制之join
/* 线程合并:将指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程,即单线程. 如在B线程中调用了A的join方法,则线程A执行完后,才会执行线程B. */ public cla ...
- 多线程入门-第五章-线程的调度与控制之yield
yield与sleep类似,只是不能指定暂停多长时间,并且只能让同优先级的线程有执行的机会,让位时间不固定. /* yield使用 */ public class ThreadTest04 { pub ...
- 多线程入门-第四章-线程的调度与控制之sleep
/* sleep,阻塞当前线程,腾出CPU,让给其他线程 单位是毫秒 静态方法 */ public class ThreadTest04 { public static void main(Strin ...
- Java 多线程基础(七)线程休眠 sleep
Java 多线程基础(七)线程休眠 sleep 一.线程休眠 sleep sleep() 方法定义在Thread.java中,是 static 修饰的静态方法.sleep() 的作用是让当前线程休眠, ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...
- Java多线程编程(七)线程状态、线程组与异常处理
一.线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中. 调用与线程有关的方法后,会进入不同的线程状态,这些状态之间某些是可双向切换的,比如WAITING和RUNNI ...
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...
- HTML与CSS入门——第七章 使用表格显示信息
知识点: 1.创建简单表格的方法 2.控制表格大小的方法 3.对齐内容及在表格中跨越行和列的方法 7.1 创建简单的表格: table标签,border控制边框 tr标签,创建表格的行,包含td td ...
- C语言入门---第七章 C语言函数
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码.函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接收数据, ...
随机推荐
- 一款基于css3鼠标经过圆形旋转特效
今天给大家分享一款基于css3鼠标经过圆形旋转特效.当鼠标经过的时候图片边框颜色旋转,图片显示详情.该实例适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗 ...
- 基于jQuery的时间轴鼠标悬停动画插件
之前为大家分享了很多jquery插件,这次我们要来分享一款不太常见的jQuery插件,它是一个时间轴,时间轴上的每一个点在鼠标滑过时都可以显示该点的描述信息,并且鼠标滑过时都可以产生一定的动画特效,比 ...
- 读取大csv文件数据插入到MySql或者Oracle数据库通用处理
import java.io.BufferedInputStream; import java.io.BufferedReader;import java.io.BufferedWriter;impo ...
- 华为/中兴 3G 语音的调试
1 microcom -s 9600 /dev/ttyUSB2(/dev/ttyUSB2不能错) 2 AT(看是否有OK输出) 3 AT+CREG?(0,1代表GSM网络注册成功) 4 AT+CSQ? ...
- ci框架简单出现的错误[Undefined property: MContacts::$db]
出现这样的错误时说明自己忘记加载数据库了, application/config/aotuload.php $autoload['libraries'] = array('database') ...
- 输出JS代码中的变量内容
一. 输出JS代码中的变量内容 1. 可以直接以提示框的形式输出 alert("输出的内容"); 2. 可以输出到网页的某个位置 a. 在显示输出的位置放一个标签 <a id ...
- php -- 用文本来存储内容,file_put_contents,serialize,unserialize
根据存储的内容来划分 字符串: file_put_contents :将一个字符串写入文件 语法:int file_put_contents ( string $filename , mixed $d ...
- javascript实现打印功能
<input name="b_print" type="button" class="ipt" onClick="print ...
- ThinkPHP项目笔记之RBAC(权限)下篇
接着谈谈:添加用户以及用户管理列表 e.添加用户
- 数据透视表sql:用SQL行列转换实现数据透视的一些思考
用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...