Java:多线程<二> 同步
由于多线程的访问出现延迟和线程的随机性,在使用多线程时往往会伴随安全性的问题,这些问题一旦出现将会是非常严重的。为了解决这种安全性问题,synchronized出现了。
synchronized用法一,放在方法内,必须传一个对象obj
synchronized(obj)
{
//需要被同步的代码
}synchronized用法二,放在方法上,不需要传对象
public synchronized void method()
{
//该方法体中所有的代码都被同步了
}例子:银行有个小金库,初始为0,有一天有两个富商来存金币,每人每次同时存100金币,没有使用同步的多线程代码
class Bank
{
private int gold=0;
public void add(int num)
{
try
{
Thread.sleep(10);
gold += num;
}
catch (Exception e)
{
System.out.println("银行内部错误,暂停服务!");
System.exit(0);
}
System.out.println("金库里有"+gold+"金币");
}
} class Business implements Runnable
{
private Bank b = new Bank();
public void run()
{
for(int i=0;i<3;i++)
{
b.add(100);
}
}
} class StoreGold
{
public static void main(String[] args)
{
Business b = new Business(); Thread t1 = new Thread(b,"张三");
Thread t2 = new Thread(b,"李四");
t1.start();
t2.start();
}
}
运行时,就有可能出现金库里有500金币两次等等错误情况,其原因是gold没有被同步,有被同时使用一个值的情况。在Bank的add方法中应该加上同步,如下
class Bank
{
private int gold=0;
public void add(int num)
{
synchronized(this)
{
try
{
Thread.sleep(10);
gold += num;
}
catch (Exception e)
{
System.out.println("银行内部错误,暂停服务!");
System.exit(0);
}
}
System.out.println("金库里有"+gold+"金币");
}
}也可以把synchronized加在方法上,这样的写法边简单了,但是同步的内容就多了。同步函数的锁是this。
class Bank
{
private int gold=0;
public synchronized void add(int num)
{
try
{
Thread.sleep(10);
gold += num;
}
catch (Exception e)
{
System.out.println("银行内部错误,暂停服务!");
System.exit(0);
}
System.out.println("金库里有"+gold+"金币");
}
}虽然同步可以让线程在处理某些事务时更为安全,但同时由于每个线程都多了拿锁、等待、释放锁等操作,所以会影响程序运行的速率。
那么什么代码需要被同步呢?
1,明确哪些代码是多线程运行代码
2,明确共享数据
3,明确多线程运行代码中哪些语句是操作共享数据的
同步使用的是什么锁呢?
1,函数使用的锁是this
2,静态函数使用的锁是类名.class,字节码文件对象
Java:多线程<二> 同步的更多相关文章
- Java多线程的同步控制记录
Java多线程的同步控制记录 一.重入锁 重入锁完全可以代替 synchronized 关键字.在JDK 1.5 早期版本,重入锁的性能优于 synchronized.JDK 1.6 开始,对于 sy ...
- java 多线程二
java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...
- Java多线程之同步集合和并发集合
Java多线程之同步集合和并发集合 不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全. 同步集合类 Hashtable Vector 同 ...
- Java多线程编程(同步、死锁、生产消费者问题)
Java多线程编程(同步.死锁.生产消费): 关于线程同步以及死锁问题: 线程同步概念:是指若干个线程对象并行进行资源的访问时实现的资源处理保护操作: 线程死锁概念:是指两个线程都在等待对方先完成,造 ...
- java多线程二之线程同步的三种方法
java多线程的难点是在:处理多个线程同步与并发运行时线程间的通信问题.java在处理线程同步时,常用方法有: 1.synchronized关键字. 2.Lock显示加锁. 3.信号量Se ...
- Java多线程的同步机制(synchronized)
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
- Java多线程(二) —— 深入剖析ThreadLocal
对Java多线程中的ThreadLocal类还不是很了解,所以在此总结一下. 主要参考了http://www.cnblogs.com/dolphin0520/p/3920407.html 中的文章. ...
- JAVA多线程线程同步问题
线程同步 在多线程的编程环境下,可能看着没有问题的代码在运行几千上万或者更多次后,出现了一些看着很奇怪的问题,出现这样的问题的原因就是可能会有两个或者更多个线程进入了同一块业务处理代码中导致了判断失效 ...
- Java多线程synchronized同步
非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程 ...
- Java多线程(二) 多线程的锁机制
当两条线程同时访问一个类的时候,可能会带来一些问题.并发线程重入可能会带来内存泄漏.程序不可控等等.不管是线程间的通讯还是线程共享数据都需要使用Java的锁机制控制并发代码产生的问题.本篇总结主要著名 ...
随机推荐
- Boost源码剖析之:泛型指针类any
C++是强类型语言,所有强类型语言对型别的要求都是苛刻的,型别一有不合编译器就会抱怨说不能将某某型别转换为某某型别,当然如果在型别之间提供了转换操作符或是标准所允许的一定程度的隐式转换(如经过非exp ...
- javascript对json对象的序列化与反序列化
首先引入一个json2.js.官方的地址为:https://github.com/douglascrockford/JSON-js 这里为了方便我直接贴上源代码 /* json2.js 2013-05 ...
- javascript面向对象详解
认识面向对象 1.面向对象中的概念 一切事物皆对象 对象具有封装和继承特性 信息隐藏 2.基本面向对象 3.函数构造器构造对象 深入了解面向对象 第一种书写格式 第二种书写格式
- little alchemy攻略
一个造物游戏: acidrain=rain+smoke airlplain=metal+bird alcohol=fruit+time algae=plant+water allergy=dust+h ...
- ajax+jquery+ashx如何实现上传文件
第一:建立Default.aspx页面 <html> <head runat="server"> <title>ajax图片上传</tit ...
- [充电]多线程无锁编程--原子计数操作:__sync_fetch_and_add等12个操作
转自:http://blog.csdn.net/minCrazy/article/details/40791795 多线程间计数操作.共享状态或者统计相关时间次数,这些都需要在多线程之间共享变量和修改 ...
- Oracle求连续的年份
SELECT ('2013') + ROWNUM year FROM dualCONNECT BY ROWNUM <= 2;
- php中的访问修饰符 private、protected、public的作用范围
1. private 只能在类内部使用 2. protected 可以在类内部和继承类里使用.类外部不能使用[即实例化后的对象无法调用] 3. public 全部范围适用. 4.子类复写父类中的方法时 ...
- Giving Data Backup Option in Oracle Forms 6i
Suppose you want to give the data backup option in Oracle Forms application to some client users, wh ...
- MyBatis简介