java线程学习
来源:互联网 发布:信捷plc编程教学视频 编辑:程序博客网 时间:2024/06/05 06:31
/*
需求:
银行有一个金库。
有两个储户分别存300元,每次存100元,存3次。
目的:找出该程序存在的安全隐患,并解决存在的安全问题!!
如何找问题:
1.明确哪些代码是多线程运行代码。
2、明确共享数据。
3、明确多线程运行代码中哪些语句是操作共享数据的
同步函数用的是哪一个锁呢?
函数需要被对象调用,那么函数都有一个所属对象引用。就是this。
所以同步函数使用的锁就是this.
通过前面的卖票程序来验证。
使用两个线程来买票。
一个线程在同步函数中。
一个线程在同步代码块中。
都在执行卖票动作。
参考视频: 多线程11天_12
如过同步函数被静态修饰后,使用的锁是什么呢?
通过验证发现不在是this,因为静态方法中不可以定义this。
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class
*/
class Bank
{
Object obj=new Object();
private int sum;
/* 加锁的方法一: 代码块加锁
public void add(int n)
{
synchronized(obj) //加锁,如果不加锁就会出现 200 200 300 400 500 600的现象!!
{
sum+=n;
try{Thread.sleep(10);}catch(Exception e){ System.out.println(e);} //冻结线程
System.out.println("总金"+sum);
}
}
*/
//加锁方法二: 方法加锁
public synchronized void add(int n)
{
sum+=n;
try{Thread.sleep(10);}catch(Exception e){ System.out.println(e);} //冻结线程
System.out.println("总金"+sum);
}
}
class Cus implements Runnable
{
Bank b=new Bank();
private void run()
{
for(int i=0;i<3;i++)
{
b.run(100);
}
}
}
class 线程笔记_锁
{
public static void main(String[] args)
{
Cus c=new Cus();
Thread t1=new Thread(c);
Thread t2=new Thread(c);
t1.start();
t2.start();
}
}
- java学习日记(线程)
- Java线程学习
- java线程学习基础
- java线程学习总结
- JAVA学习【知】线程
- Java学习之多线程
- java线程初步学习
- Java线程学习11.30
- java线程学习例子
- 关于java 线程学习
- java线程学习总结
- Java 线程池学习
- java线程的学习
- java线程的学习
- java线程池学习
- Java 线程池学习
- java线程学习
- java线程学习
- linux周六
- KScope安装
- virtual destructor的使用
- Linux hrtimer的实现
- Linux history命令用法
- java线程学习
- MS28L 预抄写文件制作
- linux 周日
- Android下拉框控件Spinner的使用
- java线程——死锁
- 迅速让你摆脱无聊的网站~~~
- 支持向量机入门系列-4:对偶问题
- js小技巧持续更新 流泪满面的404 无法找到该页的代码
- 用回溯法求解0—1背包问题,并输出问题的最优解