/*
有两个储户,到同一个银行存钱,
每次存100,存3次,两个存储是随机存入的。
这个程序有没有安全隐患呢?
分析:
1,查看线程代码中是否有共享数据。
2,这个共享数据有没有被多条语句所操作。
发现,sum是共享数据。有两条语句在操作这个共享数据,如果这两条语句被多个线程分开执行。
也就是一个线程没有执行完,其他线程就参与执行,就容易发生安全问题.
解决办法:加入同步机制。 将需要被一个线程一次执行完的代码存储带同步代码块中
发现,同步代码块是用于封装代码的。
而函数也是用封装代码的。所不同之处是同步带有锁机制。
那么如果让函数这个封装体具备同步的特性。不就可以取代同步代码块了吗?
怎么让函数具备同步性呢?
其实很简单,只要在函数上加上一个同步关键字修饰即可。
这就是同步的另一个体现形式:同步函数。
*/
class Bank
{
private int sum = 0;
//Object obj = new Object();
public synchronized void add(int num)
{
//synchronized(obj)
//{
sum = sum + num;
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....sum="+sum);
//}
}
}
class Cus implements Runnable
{
Bank b = new Bank();
public void run()
{
for(int x=0;x<3; x++)
{
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}
有两个储户,到同一个银行存钱,
每次存100,存3次,两个存储是随机存入的。
这个程序有没有安全隐患呢?
分析:
1,查看线程代码中是否有共享数据。
2,这个共享数据有没有被多条语句所操作。
发现,sum是共享数据。有两条语句在操作这个共享数据,如果这两条语句被多个线程分开执行。
也就是一个线程没有执行完,其他线程就参与执行,就容易发生安全问题.
解决办法:加入同步机制。 将需要被一个线程一次执行完的代码存储带同步代码块中
发现,同步代码块是用于封装代码的。
而函数也是用封装代码的。所不同之处是同步带有锁机制。
那么如果让函数这个封装体具备同步的特性。不就可以取代同步代码块了吗?
怎么让函数具备同步性呢?
其实很简单,只要在函数上加上一个同步关键字修饰即可。
这就是同步的另一个体现形式:同步函数。
*/
class Bank
{
private int sum = 0;
//Object obj = new Object();
public synchronized void add(int num)
{
//synchronized(obj)
//{
sum = sum + num;
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....sum="+sum);
//}
}
}
class Cus implements Runnable
{
Bank b = new Bank();
public void run()
{
for(int x=0;x<3; x++)
{
b.add(100);
}
}
}
class BankDemo
{
public static void main(String[] args)
{
Cus c = new Cus();
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
t1.start();
t2.start();
}
}