/*
* 需求:
* 银行有一个金库
* 有两个储户,分别存300元。每次存100 , 存三次
*
* 这个是有线程问题的,
*
* 我们应该通过下边的三个方法来查找问题
* 1.明确哪些代码是多线程运行的代码
* 2.明确共享数据
* 3.明确多线程运行代码中哪些是操作共享数据的
*/ class Bank
{
private int sum;
public synchronized void add (int n)
{
sum = sum + n;
try {Thread.sleep (10);}catch (Exception e){}
System.out.println ("sum="+ sum);
}
} class Cus implements Runnable
{
private Bank bank = new Bank ();
public void run(){
for (int x=0; x<3;x++){
bank.add(100); } }
}
public class BankDemo { public static void main(String[] args) { Cus cus = new Cus ();
Thread t1 = new Thread (cus);
Thread t2 = new Thread (cus);
t1.start();
t2.start(); } }

上边代码中的synchorinized 关键字 是可以放到函数前边的,这就叫做同步函数 跟下边的用法是一个作用

Object obj = new Object ();

Synchronized (obj) {

//需要同步的代码块

}

上边的代码的例子中的锁使用的对象其实就是自己本身this,在多线程操作中为了让线程安全,必须使用同一把锁

如果同步函数被static 修饰,那么就不是this了 因为静态方法中没有this 方法

静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象,叫做类名.class 该对象的类型是Class

静态的同步方法是 使用的锁是该方法坐在类的字节码文件对象。类名.class

l例如

 class Ticket implements Runnable
{
private static int tick = 100;
boolean flag = true;
Object obj = new Object();
public void run (){ if (flag){
while (true){ synchronized(Ticket.class){
if (tick > 0){
try {
Thread.sleep (10);
}
catch (Exception a)
{ }
System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
}
} }
}else
while (true)
show();
}
public static synchronized void show()
{ if (tick > 0){
try {
Thread.sleep (10);
}
catch (Exception a)
{ }
System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
}
}
} public class ThreadDemo { public static void main(String[] args) {
// TODO Auto-generated method stub Ticket t = new Ticket ();
Thread t1 = new Thread (t);
Thread t2 = new Thread (t);
// Thread t3 = new Thread (t);
// Thread t4 = new Thread (t);
t1.start();
t2.start();
// t3.start();
// t4.start(); } }

java 中多线程的同步函数的运用的更多相关文章

  1. 2.1多线程(java学习笔记) java中多线程的实现(附静态代理模式)

    一.多线程 首先我们要清楚程序.进程.线程的关系. 首先进程从属于程序,线程从属于进程. 程序指计算机执行操作或任务的指令集合,是一个静态的概念. 但我们实际运行程序时,并发程序因为相互制约,具有“执 ...

  2. java中多线程执行时,为何调用的是start()方法而不是run()方法

    Thead类中start()方法和run()方法的区别 1,start()用来启动一个线程,当调用start()方法时,系统才会开启一个线程,通过Thead类中start()方法来启动的线程处于就绪状 ...

  3. python 中的sort 和java中的Collections.sort()函数的使用

    x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...

  4. Java进阶(四十二)Java中多线程使用匿名内部类的方式进行创建3种方式

    Java中多线程使用匿名内部类的方式进行创建3种方式 package cn.edu.ujn.demo; // 匿名内部类的格式: public class ThreadDemo { public st ...

  5. JAVA中的内联函数

    在说内联函数之前,先说说函数的调用过程. 调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到 转去执行该函数前的地方.这种转移操作要求在转去前要保护 ...

  6. Java中的线程同步

    Java 中的线程同步问题: 1. 线程同步: 对于访问同一份资源的多个线程之间, 来进行协调的这个东西. 2. 同步方法: 当某个对象调用了同步方法时, 该对象上的其它同步方法必须等待该同步方法执行 ...

  7. Java中多线程的使用(超级超级详细)线程池 7

    Java中多线程的使用(超级超级详细)线程池 7 什么是线程池? 线程池是一个容纳多个线程的容器,线程池中的线程可以重复使用,无需反复创建线程而消耗过多的资源 *使用多线程的好处: 1.降低消耗,减少 ...

  8. Java中多线程的使用(超级超级详细)线程安全原理解析 4

    Java中多线程的使用(超级超级详细)线程安全 4 什么是线程安全? 有多个线程在同时运行,这些线程可能会运行相同的代码,程序运行的每次结果和单线程运行的结果是一样的,而且其他变量的值也和预期的值一样 ...

  9. Java中的lambda匿名函数使用

    Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...

随机推荐

  1. 测试 MathJax 排版功效

    这是第一篇博文,用于检测博客园提供的数学排版功能,下面是一些数学公式. \[ \text{sgn}(\mathbf{w}^T\phi(\mathbf{x})+b) = \text{sgn}\left( ...

  2. Mysql的用户名密码设置方法

    方法如下: 1, 关闭mysql服务 /etc/init.d/mysqld stop 2,使用 –skip-grant-tables选项启动mysql服务,可以修 改/etc/inin.d/mysql ...

  3. VS加入全局缓存

    1. 加载 gacutil.exe /i <DLL Name>.dll 2. 卸载 gacutil.exe /u <DLL Name>

  4. VB.Net 2010中 ./和../的含义

    文件路径 文件路径就是文件在电脑(服务器)中的位置,表示文件路径的方式有两种:相对路径和绝对路径. Windows由于使用 斜杆/ 作为DOS命令提示符的参数标志了,为了不混淆,所以采用 反斜杠\ 作 ...

  5. 游戏编程技巧 - Type Object

    Type Object 使用场景 你在制作一款和LOL类似的游戏,里面有许多英雄,因此你想建立一个英雄基类,然后把各种英雄都继承自该基类,这些英雄类都有生命值和攻击力等属性.每次策划想增加一个英雄,你 ...

  6. jquery 选择元素

  7. C#_技巧:真伪随机数

    使用 Random 产生随机数.(这是一种伪随机数,需要seed,同一个seed后,采用某种算法产生的数字序列都是一样的) 两种写法 错误 for(int i=0;i<100;i++) {    ...

  8. 学习笔记: Delphi之线程类TThread

    新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...

  9. 玩转JavaScript OOP[0]——基础类型

    前言 long long ago,大家普遍地认为JavaScript就是做一些网页特效的.处理一些事件的.我身边有一些老顽固的.NET程序员仍然停留在这种认知上,他们觉得没有后端开发肯定是构建不了系统 ...

  10. [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧

    不知不觉又半个月没有更新博客了,今天终于抽出点时间,来分享一下前段时间的成果. 在网上,我们经常看到各种各样的图片,尤其是GIF图片的动态效果,让整个网站更加富有表现力!有时候,我们看到一些比较好看的 ...