多线程入门-第七章-线程的同步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语言函数
函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码.函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接收数据, ...
随机推荐
- zend server mac 下配置
Post Installation on Mac OS X If you intend to use PHP and other tools provided by Zend Server (pear ...
- Windows Phone 性能优化(二)
这篇文章的 demo 是在 (一)的基础上进行的调整,逻辑基本相似.本文只列和 上一篇出不同的代码. 为了实现自定义的虚拟化,把上一篇文章的 ListBox 换成 ScrollViewer + Ite ...
- Servlet请求转发RequestDispatcher接口
在Servlet中,利用RequestDispatcher对象,可以将请求转发给另外一个Servlet或JSP页面,甚至是HTML页面,来处理对请求的响应. 一,RequestDispatcher接口 ...
- 跟着百度学PHP[10]-读取COOKIE案例
<?php if(!isset($_COOKIE['visittime'])){ #使用$_COOKIE获取visittime,如果不存在就执行下面的语句块,否则执行else setcookie ...
- linux内核对中断的处理方式
中断取代了轮询的通知方式,DMA取代了轮询的读写数据方式. 分类软件指令造成的中断(又叫异常,同步中断). svc, und, abt硬件通过中断请求信号造成的中断(异步中断). irq,fi ...
- js跨域问题(2)
前两天碰到一个跨域问题的处理,使用jsonp可以解决.(http://www.cnblogs.com/xtechnet/p/4123210.html) 最近再整理了一下: 非CORS 1.jsonp. ...
- Linux tar This does not look like a tar archive
由于昨天公司内网服务器坏了,所以急需搭建新的Linux环境. 在安装maven时,使用tar 命令解压maven.tar.gz出现: tar :This does not look like a ta ...
- 【转】社区O2O的增量与存量,机会在哪?
在[O2凹凸社]的前一篇<社区O2O创业百态:三教九流>中总结过目前社区O2O行业的创业氛围,那更进一步看为何有这么多创业者想进入社区O2O市场呢?社区O2O的吸引力在哪?机会又在哪? 一 ...
- 数据库 数据库SQL语句四
多表查询 等值连接 --查询员工信息,员工号,姓名,月薪,部门名称 select e.empno,e.ename,d.dname from emp e,dept d where e.deptno=d. ...
- php json包 Services_JSON-1.0.2 1 ---one