这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提:

* 1.必须要有两个以上的线程,才需要同步。
 * 2.必须是多个线程使用同一个锁。
 * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码

那么我们要思考的地方有:1.知道我们写的哪些是多线程代码

2.明确共享数据

3.明确多线程运行的代码中哪些语句是操作共享数据的。、

            4.要确保多个线程使用同一个锁。

下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完。

 第一种写法:使用同步代码块的方式

class bank{
private int sum;
Object obj = new Object();//对象锁
public void add(int money){
synchronized (obj) {
sum +=money;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("sum="+sum);
} } }

第二种方法在函数上加synchronized:

class bank{
private int sum;
//函数封装代码(加synchronized)==同步块封装代码
public synchronized void add(int money){
sum +=money;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("sum="+sum);
} } class Cus implements Runnable{
private bank b = new bank(); @Override
public void run() {
for(int i=0;i<3;i++){
//System.out.println(Thread.currentThread().getName());
b.add(100);
}
}
} public class BankDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Cus c1 = new Cus();
Thread t1 = new Thread(c1);
Thread t2 = new Thread(c1);
t1.start();
t2.start(); } }

总结:同步应该加到add方法上面,因为add方法被run方法调用,所以是线程代码,这里的sum是共享数据,add方法 里面 sum +=money;操作共享数据。这里用了在普通方法上面加syncronized代替同步代码块,这也叫做同步函数。那么同步函数用的锁是什么?我们下一节再接着讨论,多线程同步函数。

 

最新文章

  1. Sublime一键预览
  2. REST API出错响应的设计
  3. 全栈工程师学习Linux技术的忠告
  4. UDP 内网穿透 心跳
  5. PHP 日期比较
  6. 20140122-Application19事件
  7. Borg Maze(bfs+prim)
  8. 不知道算不算另类的ASP.NET MVC4 Ajax分页
  9. Power Designer - 反向获取数据库物理模型时Unable to list the users 异常
  10. sqlserver 存储过程实例
  11. 【语法】修饰符 static extern const
  12. Qt 之 入门例程(二)
  13. Servlet转发到JSP页面的路径问题
  14. Ubuntu16.04安装和配置RabbitMQ
  15. C++———库函数cstring及string方法解读
  16. ES6中字符串扩展
  17. oracle中如何修改用户名和密码
  18. java也可以做黑客?
  19. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)
  20. Windows上搭建Flume运行环境

热门文章

  1. 《iptables详解 》RHEL6
  2. CentOS6.5升级手动安装gcc4.8.2
  3. uniform 中checkbox通过jquery 选中
  4. 用jQuery解析复杂的xml结构文件
  5. mysql数据库表格导出为excel表格
  6. Mysql备份--mysqldump&amp;outfile
  7. Codeforces 559A 第六周 O题
  8. 【转载】MySQL 5.6主从Slave_IO_Running:Connecting/error connecting to master *- retry
  9. Vbox安装oracle-linux报错:VT-x features locked or unavailable in M
  10. Hadoop2安装