/*
异步编程模型:两个线程执行自己的,互不影响。 同步编程模型: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的更多相关文章

  1. 多线程入门-第六章-线程的调度与控制之join

    /* 线程合并:将指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程,即单线程. 如在B线程中调用了A的join方法,则线程A执行完后,才会执行线程B. */ public cla ...

  2. 多线程入门-第五章-线程的调度与控制之yield

    yield与sleep类似,只是不能指定暂停多长时间,并且只能让同优先级的线程有执行的机会,让位时间不固定. /* yield使用 */ public class ThreadTest04 { pub ...

  3. 多线程入门-第四章-线程的调度与控制之sleep

    /* sleep,阻塞当前线程,腾出CPU,让给其他线程 单位是毫秒 静态方法 */ public class ThreadTest04 { public static void main(Strin ...

  4. Java 多线程基础(七)线程休眠 sleep

    Java 多线程基础(七)线程休眠 sleep 一.线程休眠 sleep sleep() 方法定义在Thread.java中,是 static 修饰的静态方法.sleep() 的作用是让当前线程休眠, ...

  5. Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)

    第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算 ...

  6. Java多线程编程(七)线程状态、线程组与异常处理

    一.线程的状态 线程对象在不同的运行时期有不同的状态,状态信息就存在于State枚举类中. 调用与线程有关的方法后,会进入不同的线程状态,这些状态之间某些是可双向切换的,比如WAITING和RUNNI ...

  7. Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)

    7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层 ...

  8. HTML与CSS入门——第七章 使用表格显示信息

    知识点: 1.创建简单表格的方法 2.控制表格大小的方法 3.对齐内容及在表格中跨越行和列的方法 7.1 创建简单的表格: table标签,border控制边框 tr标签,创建表格的行,包含td td ...

  9. C语言入门---第七章 C语言函数

    函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码.函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接收数据, ...

随机推荐

  1. java学习之局部变量以及全局变量

    全局变量 什么是全局变量? 全局变量就好比一个容器或者一个公用的东西一样,就类似外面公共场所的凳子一样,大家都可以使用这个凳子. 和他相反的局部变量是啥子东东呢? 局部变量就是局部的东西,如果全局变量 ...

  2. Ubuntu安装Sublime Text 2

    参考资料:http://www.technoreply.com/how-to-install-sublime-text-2-on-ubuntu-12-04-unity/ 1.去Sublime Text ...

  3. 卡特兰数 catalan number

    作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...

  4. gcc 编译流程分析

    //test.c #include<stdio.h> int main() { ,y=; printf("x=%d y=%d\n",x,y); ; } 1:预处理阶段, ...

  5. 嵌入式linux性能详解_转

    最近简单看了下<嵌入式Linux性能详解>一书,对系统内存分布测试.程序运行.动态库等都很很好的解析. 作者史子旺,loughsky@sina.com. 有时间希望仔细通读,并验证.

  6. HTTP Content-Disposition Explanation [ from MDN ]

    在常规的HTTP应答中,Content-Disposition 消息头指示回复的内容该以何种形式展示,是以内联的形式(即网页或者页面的一部分),还是以附件的形式下载并保存到本地. 在multipart ...

  7. ubuntu 解压命令全部

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

  8. wifi的web 认证。

    wifi的web 认证.wifidog+authpuppy+php 或者Wiwiz Auth API

  9. LoadRunner中的异常处理

    在脚本的Run-time Settings中,可以设置在脚本运行过程中发生错误的处理方式.进入到Run-time Settings中,切换到Miscellaneous标签页,可以看到Error Han ...

  10. LodRunner实现大负载测试的四部曲(配置系统参数、配置LR、修改脚本、设置组策略)

    见 http://www.51testing.com/?uid-97659-action-viewspace-itemid-210924 LoadRunner以下简称(LR)是目前业界最流行的压力测试 ...