线流中的锁
2015-09-21 15:14
357 查看
线流中的锁
线程同步本质: (数据同步)
当多个线程(服务,任务),操作同一个数据的时候,保证数据一致.本质就是数据同步,是一种数据安全机制。
这种机制,操作上更多是从数据上来保护的。
异步编程模型:
线程是完全独立的,谁的运行也不会受到别的线程的影响。
同步编程模型:
线程间不是独立的,相互间有影响的.某些线程必须单独完成任务以后,才能够让别的线程执行。
同步的原因:
一. 同步是指数据的同步,为了数据安全,必须要等某个线程对数据操作完成以后,在引入别的线程进行操作。
同步机制,某种程度是多线程编程变成了单线程。
二. 同步的环境
1 必须多线程。
2 多个线程有同时操作同一个数据的可能性。
3 主要就是涉及数据更改的操作。
线程同步是数据的概念
方法:锁定,锁定是一个逻辑上的概念,是为了保证同步的手段。
方法锁:按照封装性,根本不可能在是直接就能对数据进行操作,只能通过方法进行操作。
对象锁:堆内存,只要一加锁,谁也进不来。
只要加了 synchronized 成员方法,是多个线程不可以用加了synchronized的方法同时访问这个对象
同一个方法互斥,不同的方法也互斥。
实例:
看一下结果:
但是在工作的时候,最怕的是写一个死锁,看一下死锁是什么样子的:
这就是一个死锁,虽然不一定锁死,但是一旦锁死,就会让程序终止!
线程同步本质: (数据同步)
当多个线程(服务,任务),操作同一个数据的时候,保证数据一致.本质就是数据同步,是一种数据安全机制。
这种机制,操作上更多是从数据上来保护的。
异步编程模型:
线程是完全独立的,谁的运行也不会受到别的线程的影响。
同步编程模型:
线程间不是独立的,相互间有影响的.某些线程必须单独完成任务以后,才能够让别的线程执行。
同步的原因:
一. 同步是指数据的同步,为了数据安全,必须要等某个线程对数据操作完成以后,在引入别的线程进行操作。
同步机制,某种程度是多线程编程变成了单线程。
二. 同步的环境
1 必须多线程。
2 多个线程有同时操作同一个数据的可能性。
3 主要就是涉及数据更改的操作。
线程同步是数据的概念
方法:锁定,锁定是一个逻辑上的概念,是为了保证同步的手段。
方法锁:按照封装性,根本不可能在是直接就能对数据进行操作,只能通过方法进行操作。
对象锁:堆内存,只要一加锁,谁也进不来。
只要加了 synchronized 成员方法,是多个线程不可以用加了synchronized的方法同时访问这个对象
同一个方法互斥,不同的方法也互斥。
实例:
public class Thread_11_Synchronization{ public static void main(String[] args){ Account act = new Account("actNo_001",3000); Thread t1 = new Thread(new Processor(act)); Thread t2 = new Thread(new Processor(act)); t1.setName("t1---"); t1.start();//2000; t2.setName("t2---"); t2.start();//1000; } } //线程类 class Processor implements Runnable{ //一个账户,就开启一个线程 Account act; //Processor Processor(Account act){ this.act = act; } public void run(){ act.withDraw(1000.0);//================= //我哪里睡一秒的目的,是为了这里输出争取时间 System.out.println( "取款成功:1000.00, 余额是:" + Thread.currentThread().getName() + act.getBalance() ); } } //实体类 class Account{ private String actNo; private double balance; public Account(){} public Account(String actNo, double balance){ this.actNo = actNo; this.balance = balance; } public double getBalance(){ return balance; } public void setActNo(String actNo){ this.actNo = actNo; } public String getActNo(){ return actNo; } public synchronized void setBalance(String actNo, double balance){ if (this.actNo == actNo) { this.balance = balance; } } //实际的业务操作 //synchronized:是让方法有能力锁定某个对象 public synchronized void withDraw(double money){ //synchronized(this); double after = balance - money; /** * 开始我们就看到,取钱两次,钱少了一次,所以有问题; * 这里我们引入一个锁的概念,和我们家用的锁区别不大:都是只允许某个人某些人操作,不让别人操作.这个是一个很重要的概念,就是为了数据的安全;数据库中也有; * java中锁的关键字是synchronized,这个关键字并不是加锁,实际上每个对象,都有自己的锁,每个类,也有自己的锁,这个关键字只是把锁锁上的动作,直到程序运行完成再打开锁,允许别的操作继续 * 可以用于限制某个代码段或者某个方法 */ try{ Thread.sleep(1000);//为什么睡眠一秒 }catch(Exception e){ e.printStackTrace(); } //更新账户,真正对余额产生影响的是这里 //System.out.println( Thread.currentThread().getName() + "线程进行操作,这个时候,别的线程是操作不了的" ); this.setBalance(actNo,after); //System.out.println( Thread.currentThread().getName() + "线程进行操作,这个时候,别的线程是操作不了的" ); } }
看一下结果:
但是在工作的时候,最怕的是写一个死锁,看一下死锁是什么样子的:
public class Thread_14_synchronized{ public static void main(String[] args)throws Exception{ Thread t1 = new Thread(new Processor(new MyClass())); Thread t2 = new Thread(new Processor(new MyClass()));//我new的时候,调用的是该类无参构造,但是由于我指定了构造方法,所以编译器不会再给我生成一个无参构造. t1.setName("t1"); t2.setName("t2"); t1.start();//调用线程中的run() //延迟主线程,保证t1先执行 Thread.sleep(1000); t2.start(); } } //线程类的作用:调用业务类实现业务逻辑 class Processor implements Runnable{ MyClass mc; //这个是个什么东西?构造方法, Processor(MyClass mc){ this.mc = mc; } public void run(){ if ("t1".equals(Thread.currentThread().getName())) { //mc.m1(); MyClass.m1(); } if ("t2".equals(Thread.currentThread().getName())) { //mc.m2(); MyClass.m2(); } } } //业务类:就是业务逻辑 class MyClass {//死锁 public synchronized static void m1(){//加在静态方法上面的锁叫类锁,只有有这个类锁完全解除,也就是说没有任何静态方法执行的时候,才会交出锁,让下一个执行 //目的,在执行该方法中,不会被别的线程打断 try{ //System.out.println( "" ); Thread.sleep(5000);//这个5秒的作用就是保证m1()在执行的时候,就不会被执行的一个演示效果 }catch(Exception e){ e.printStackTrace(); } System.out.println( "m1() 方法被执行了" ); } public synchronized static void m2(){ System.out.println( "m2() 方法被执行了" ); } }
这就是一个死锁,虽然不一定锁死,但是一旦锁死,就会让程序终止!
相关文章推荐
- TradeStation简介
- 我的自白
- 【svn】设置过滤文件
- 判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
- Java调用Telnet示例
- FirstBlood
- 多线程
- knockoutJS学习笔记03:knockout简介
- linux ubuntu服务器中搭建tomcat
- 一个个熟悉的排序
- offer
- 使用随身wifi实时抓取手机数据包
- http://blog.csdn.net/abcjennifer/article/details/7716281 过拟合问题
- 限制EditText只能输入整数
- hdu acm2548
- 限制EditText只能输入整数
- 【Android】android:windowSoftInputMode属性详解
- 数据存储方式
- CloudFoundry.yml修订
- JavaScript之Date