一Java规划共享多个线程之间数据的能力。
当线程以异步方式訪问共享数据时。有时候是不安全的或者不和逻辑的。

比方卖火车票。同一时刻一个线程在读取数据,另外一个线程在处理数据,当处理数据的线程没有等到读取数据的线程读取完成就去处理数据,必定得到错误的处理结果。



卖火车票Demo:
class MyThread implements Runnable{
private int ticket = 5 ; // 如果一共同拥有5张票
public void run(){
for(int i=0;i<100;i++){
if(ticket>0){ // 还有票
try{
Thread.sleep(300) ; // 增加延迟
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("卖票:ticket = " + ticket-- );
}
}
}
};
public class SyncDemo01{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ; // 定义Thread对象
Thread t2 = new Thread(mt) ; // 定义Thread对象
Thread t3 = new Thread(mt) ; // 定义Thread对象
t1.start() ;
t2.start() ;
t3.start() ;
}
};

执行有可能出现下面结果:

.......
卖票:ticket=1
卖票:ticket=0
卖票:ticket=-1

Java 编程语言提供了一种简单的机制来防止发生这样的覆盖。

每一个对象在执行时都有一个关联的锁。这个锁可通过为方法加入keyword
synchronized 来获得。
同步有两种方式:同步块和同步方法


同步块:对易发生冲突的语句块加锁

class MyThread implements Runnable{
private int ticket = 5 ; // 如果一共同拥有5张票
public void run(){
for(int i=0;i<100;i++){
synchronized(this){ // 要对当前对象进行同步
if(ticket>0){ // 还有票
try{
Thread.sleep(300) ; // 增加延迟
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("卖票:ticket = " + ticket-- );
}
}
}
}
};
public class SyncDemo02{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ; // 定义Thread对象
Thread t2 = new Thread(mt) ; // 定义Thread对象
Thread t3 = new Thread(mt) ; // 定义Thread对象
t1.start() ;
t2.start() ;
t3.start() ;
}
};

同步方法:对易发生冲突的方法块加锁

class MyThread implements Runnable{
private int ticket = 5 ; // 如果一共同拥有5张票
public void run(){
for(int i=0;i<100;i++){
this.sale() ; // 调用同步方法
}
}
public synchronized void sale(){ // 声明同步方法
if(ticket>0){ // 还有票
try{
Thread.sleep(300) ; // 增加延迟
}catch(InterruptedException e){
e.printStackTrace() ;
}
System.out.println("卖票:ticket = " + ticket-- );
} }
};
public class SyncDemo03{
public static void main(String args[]){
MyThread mt = new MyThread() ; // 定义线程对象
Thread t1 = new Thread(mt) ; // 定义Thread对象
Thread t2 = new Thread(mt) ; // 定义Thread对象
Thread t3 = new Thread(mt) ; // 定义Thread对象
t1.start() ;
t2.start() ;
t3.start() ;
}
};


版权声明:本文博主原创文章,博客,未经同意不得转载。

最新文章

  1. Collection框架
  2. WPF DEV控件-ChartControl用法
  3. JavaScript prototype 使用介绍
  4. 安装使用ubuntu和opensuse
  5. OpenCV3添加滑动条和鼠标事件到图形界面
  6. @Entity设置实体lazy = false
  7. jquery 里面的$(document).ready 和 DOMContentLoaded
  8. SE 2014年5月23日
  9. c#与oracle数据库连接池
  10. 如果gen.lib.rus.ec这个电子书下载站上不去了,那就用这个吧
  11. MyEclipse安装Eclipse Memory Analyzer插件以及使用例子
  12. 苹果绿RGB值
  13. 百度分享到修改url
  14. Logic and Proofs--离散数学
  15. asp.net core mvc发布后显示异常错误信息的方法
  16. 题解-拉格朗日(bzoj3695变种)
  17. Python全栈之路----数据类型—元组类型
  18. MT【13】三角函数求范围
  19. 性能测试二十一:环境部署之mysql
  20. JAVA基础知识点总结(全集)

热门文章

  1. 读书时间《JavaScript高级程序设计》六:事件
  2. OOP思想
  3. Mongodb安装和配置
  4. 读书时间《JavaScript高级程序设计》一:基础篇
  5. 【原创】构建高性能ASP.NET站点之一 剖析页面的处理过程(前端)
  6. 在python正在使用mysql
  7. webpack打包avalon
  8. Android开发学习总结——Android开发的一些相关概念(转)
  9. Android 获取屏幕大小和密度
  10. Code digest