1、同步代码块经典实例:
一、需求:一个银行帐户5000块,两夫妻一个拿着存折,一个拿着卡,开始取钱比赛,每次只能取一千块,要求不许出现线程安全问题。安全
二、目的:该程序是否有安全问题,若是有,如何解决?
多线程
三、如何找问题:
1)明确哪些代码是多线程运行代码。
2)明确共享数据。
3)明确多线程运行代码中哪些语句是操做共享数据的。函数
四、代码解决:
方式一:
方式二(正确方法):this
package sram.thread; public class BankThread extends Thread{ static int money = 5000; public BankThread(){ } public BankThread(String name){ super(name); } public void run() { while(true){ synchronized("锁"){ if(money>0){ System.out.println(currentThread().getName()+ "取了1000元,还剩"+(money-1000)+"元"); money-=1000; } } } } public static void main(String args[]){ BankThread user1 = new BankThread("老公"); BankThread user2 = new BankThread("老婆"); user1.start(); user2.start(); } }
2、同步函数:
一、同步函数定义:同步函数就是使用synchronized修饰一个函数。线程
二、同步函数要注意的事项 :
1)若是是一个非静态的同步函数的锁对象是this对象,若是是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。
a)非静态同步函数(锁不住):
使用形式一:
使用形式二:
b)静态同步函数:
图解:
2)同步函数的锁对象是固定的,不能由你来指定的。code
三、同步代码块、同步函数对比(推荐使用: 同步代码块)。
缘由:
1)同步代码块的锁对象能够由咱们随意指定,方便控制。同步函数的锁对象是固定的,不能由咱们来指定。
2)同步代码块能够很方便控制须要被同步代码的范围,同步函数必须是整个函数的全部代码都被同步了。对象