线流中的锁

线程同步本质: (数据同步)
       当多个线程(服务,任务),操作同一个数据的时候,保证数据一致.本质就是数据同步,是一种数据安全机制。
       这种机制,操作上更多是从数据上来保护的。
   异步编程模型:
       线程是完全独立的,谁的运行也不会受到别的线程的影响。
   同步编程模型:
       线程间不是独立的,相互间有影响的.某些线程必须单独完成任务以后,才能够让别的线程执行。
    同步的原因:
           一.  同步是指数据的同步,为了数据安全,必须要等某个线程对数据操作完成以后,在引入别的线程进行操作。
               同步机制,某种程度是多线程编程变成了单线程。
           二.  同步的环境
               1 必须多线程。
               2 多个线程有同时操作同一个数据的可能性。
               3 主要就是涉及数据更改的操作。
     线程同步是数据的概念
       方法:锁定,锁定是一个逻辑上的概念,是为了保证同步的手段。
       方法锁:按照封装性,根本不可能在是直接就能对数据进行操作,只能通过方法进行操作。
       对象锁:堆内存,只要一加锁,谁也进不来。
   只要加了 synchronized 成员方法,是多个线程不可以用加了synchronized的方法同时访问这个对象
   同一个方法互斥,不同的方法也互斥。

实例:

 1 public class Thread_11_Synchronization{
 2     public static void main(String[] args){
 3         Account act = new Account("actNo_001",3000);
 4         Thread t1 = new Thread(new Processor(act));
 5         Thread t2 = new Thread(new Processor(act));
 6         t1.setName("t1---");
 7         t1.start();//2000;
 8         t2.setName("t2---");
 9         t2.start();//1000;
10     }
11 }
12 //线程类
13 class Processor implements Runnable{
14     //一个账户,就开启一个线程
15     Account act;
16     //Processor
17     Processor(Account act){
18         this.act = act;
19     }
20     public void run(){
21         act.withDraw(1000.0);//=================
22         //我哪里睡一秒的目的,是为了这里输出争取时间
23         System.out.println( "取款成功:1000.00, 余额是:" + Thread.currentThread().getName() + act.getBalance() );
24     }
25 }
26 //实体类
27 class Account{
28     private String actNo;
29     private double balance;
30     public Account(){}
31     public Account(String actNo, double balance){
32         this.actNo = actNo;
33         this.balance = balance;
34     }
35     public double getBalance(){
36         return balance;
37     }
38     public void setActNo(String actNo){
39         this.actNo = actNo;
40     }
41     public String getActNo(){
42         return actNo;
43     }
44     public synchronized void setBalance(String actNo, double balance){
45         if (this.actNo == actNo) {
46             this.balance = balance;
47         }
48     }
49     //实际的业务操作
50     //synchronized:是让方法有能力锁定某个对象
51     public synchronized void withDraw(double money){
52         //synchronized(this);
53         double after = balance - money;
54         /**
55          *  开始我们就看到,取钱两次,钱少了一次,所以有问题;
56          *  这里我们引入一个锁的概念,和我们家用的锁区别不大:都是只允许某个人某些人操作,不让别人操作.这个是一个很重要的概念,就是为了数据的安全;数据库中也有;
57          *  java中锁的关键字是synchronized,这个关键字并不是加锁,实际上每个对象,都有自己的锁,每个类,也有自己的锁,这个关键字只是把锁锁上的动作,直到程序运行完成再打开锁,允许别的操作继续
58          *  可以用于限制某个代码段或者某个方法
59          */
60         try{
61             Thread.sleep(1000);//为什么睡眠一秒
62         }catch(Exception e){
63             e.printStackTrace();
64         }
65         //更新账户,真正对余额产生影响的是这里
66         //System.out.println( Thread.currentThread().getName() + "线程进行操作,这个时候,别的线程是操作不了的" );
67         this.setBalance(actNo,after);
68         //System.out.println( Thread.currentThread().getName() + "线程进行操作,这个时候,别的线程是操作不了的" );
69     }
70 }

看一下结果:

但是在工作的时候,最怕的是写一个死锁,看一下死锁是什么样子的:

 1 public class Thread_14_synchronized{
 2     public static void main(String[] args)throws Exception{
 3         Thread t1 = new Thread(new Processor(new MyClass()));
 4         Thread t2 = new Thread(new Processor(new MyClass()));//我new的时候,调用的是该类无参构造,但是由于我指定了构造方法,所以编译器不会再给我生成一个无参构造.
 5         t1.setName("t1");
 6         t2.setName("t2");
 7         t1.start();//调用线程中的run()
 8         //延迟主线程,保证t1先执行
 9         Thread.sleep(1000);
10         t2.start();
11     }
12 }
13 //线程类的作用:调用业务类实现业务逻辑
14 class Processor implements Runnable{
15     MyClass mc;
16     //这个是个什么东西?构造方法,
17     Processor(MyClass mc){
18         this.mc = mc;
19     }
20     public void run(){
21         if ("t1".equals(Thread.currentThread().getName())) {
22            //mc.m1();
23            MyClass.m1();
24         }
25         if ("t2".equals(Thread.currentThread().getName())) {
26             //mc.m2();
27             MyClass.m2();
28         }
29     }
30 }
31 //业务类:就是业务逻辑
32 class MyClass {//死锁
33     public synchronized static void m1(){//加在静态方法上面的锁叫类锁,只有有这个类锁完全解除,也就是说没有任何静态方法执行的时候,才会交出锁,让下一个执行
34         //目的,在执行该方法中,不会被别的线程打断
35         try{
36             //System.out.println( "" );
37             Thread.sleep(5000);//这个5秒的作用就是保证m1()在执行的时候,就不会被执行的一个演示效果
38         }catch(Exception e){
39             e.printStackTrace();
40         }
41         System.out.println( "m1() 方法被执行了" );
42     }
43     public synchronized static void m2(){
44         System.out.println( "m2() 方法被执行了" );
45     }
46 }

这就是一个死锁,虽然不一定锁死,但是一旦锁死,就会让程序终止!

时间: 2024-10-20 05:58:07

线流中的锁的相关文章

Mysql中那些锁机制之InnoDB

我们知道mysql在曾经.存储引擎默认是MyISAM.可是随着对事务和并发的要求越来越高,便引入了InnoDB引擎.它具有支持事务安全等一系列特性. InnoDB锁模式 InnoDB实现了两种类型的行锁. 共享锁(S):同意一个事务去读一行,阻止其它事务获得同样的数据集的排他锁. 排他锁(X):同意获得排他锁的事务更新数据,可是组织其它事务获得同样数据集的共享锁和排他锁. 能够这么理解: 共享锁就是我读的时候,你能够读,可是不能写.排他锁就是我写的时候.你不能读也不能写.事实上就是MyISAM的

Innodb中的锁

虽然比较擅长的是Oracle,但是公司使用的是MySQL数据库,所以不得不对MySQL数据库多研究一下.今天就谈一下MySQL中的锁. 谈锁之前,要明白为什么会有锁这种东西.之所以有锁,大部分情况下是为了实现事务(transaction)之间的隔离,那么事务之间有几种隔离方式,各种隔离方式又是为了达到什么效果呢?先来说一下各种读现象. 脏读:即一个事务A读取了事务B还没有提交过的数据: 不可重复读:即事务A在第一次按照某条SQL语句读取后跟第二次按照相同的SQL语句读取数据库,这段时间内,事务B

c#语言-多线程中的锁系统

介绍 平常在多线程开发中,总避免不了线程同步.这次就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 二: mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.Wri

十一、JUC包中的锁

JUC,即java.util.concurrent. 悲观锁和乐观锁 悲观锁和乐观锁是一种思想. 悲观锁,持有一种悲观的态度,认为会出现很坏的情况,所以,先做预防措施.独占锁是一种悲观锁,synchronized就是一种独占锁. 而乐观锁,则是持有一种持有种乐观的态度,认为不会出现什么问题,有问题了再说. 对于常用多线程编程的人估计知道,在jdk5之前,在多线程编程的时候,为了保证多个线程对一个对象同时进行访问时,我们需要加同步锁synchronized,保证对象的在使用时的正确性,但是加锁的机

Hibernate中的锁机制

锁机制:是数据库为了保证数据的一致性<一个事务的各种操作不相互影响>而使各种共享资源在被并发访问访问变得有序所设计的一种规则,用来保证在当前用户进行操作数据的时候其他的用户不能对同一数据进行任何操作. Hibernate是一个持久层框架,他的操作就是用来存取数据库中的数据,为了保证数据的一致性,hibernate提供了自己的锁机制. Hibernate的锁机制: 乐观锁:<pessimistic locking>他认为一般不会出现多个用户同时操作同一条数据的情况,因此不做资料库层次

sql server中的锁 事务锁 更新锁 保持锁 共享锁 你知道吗?

锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SELECT 语句中"加锁选项"的功能说明 SQL Server提供了强大而完备的锁机制来帮助实现数据库系统的并发性和高性能.用户既能使用SQL Ser

MySQL 温故而知新--Innodb存储引擎中的锁

近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ?  排它锁(X lock).同意事务删除或者更新一行数据. 当一个事务获取了行r的共享锁.那么另外一个事务也能够马上获取行r的共享锁,由于读取并未改变行r的数据.这样的情况就是锁兼容. 可是假设有事务想获得行r的排它锁,则它必须等待事务释放行r上的共享锁-这样的情况就是锁不兼容.二者兼容性例如以下表

java 多线程中的锁的类别及使用

目前在Java中存在两种锁机制: synchronized Lock Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea. 数据同步需要依赖锁,那锁的同步又依赖谁? synchronized给出的答案是在软件层面依赖JVM, 而Lock给出的方案是在硬件层面依赖特殊的CPU指令 Synchronized 其应用层的语义是可以把任何一个非null对象作为"锁" 当synchronized作用在方法上时,锁住的便是对象实例(this): 当作用在静态方法

【转载】Java中的锁机制 synchronized &amp; Lock

参考文章: http://blog.csdn.net/chen77716/article/details/6618779 目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理. 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的