java线程之线程同步
本篇由于涉及多线程操作,所以线程是使用实现Runnable接口来创建的。
在上篇所示线程任务中,我们不难发现,是存在三步操作的:
第一:打印语句;
第二:计算sum=sum-1;
第三:线程休眠。
那么,在多线程操作中,可能会出现,第一个线程准备打印,还没有进行sum=sum-1计算时,第二个线程也开始打印语句了,
那么此时第二个线程打印语句中的sum值由于还没有经过线程1处理,所以线程二打印的语句也会是“还剩49个苹果”,要解决
这个问题,就引入了线程同步概念,将线程中的所有操作(任务)视为同步处理,是不分先后的。那么,只要线程1比线程2早
开启,哪怕是1纳秒,线程2中num的初始值也是49,所以线程2输出语句是“还剩48个苹果”,线程同步有三种方法。这里只针对
具体任务贴出同步代码操作。
1.同步代码块
public void eat() {
synchronized (this) {
if (sum1 > 0) {
System.out.println(Thread.currentThread().getName() + "吃了一个苹果," + "还剩" + --sum1 + "个苹果");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
这里的this指向一个同步监听对象,可以理解为一个多线程共享资源,也就是Runnable的实例。
2.同步方法
synchronized public void eat() {
if (sum1 > 0) {
System.out.println(Thread.currentThread().getName() + "吃了一个苹果," + "还剩" + --sum1 + "个苹果");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
由于run方法不能用synchronized修饰,只能新建一个该修饰符修饰的方法,放到run里面执行。
3.同步锁(Lock)
final Lock lock = new ReentrantLock();
public void eat() {
lock.lock(); //拿锁关门
if (sum1 > 0) {
System.out.println(Thread.currentThread().getName() + "吃了一个苹果," + "还剩" + --sum1 + "个苹果");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock(); //开锁
}
}
}
这里,先在类里面定义一个锁对象,然后在进入任务之后拿锁锁上,任务结束,开锁,别的线程拿到锁才能进入任务操作。
java线程之线程同步的更多相关文章
- Java多线程 3 线程同步
在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...
- 第22章 java线程(2)-线程同步
java线程(2)-线程同步 本节主要是在前面吃苹果的基础上发现问题,然后提出三种解决方式 1.线程不安全问题 什么叫线程不安全呢 即当多线程并发访问同一个资源对象的时候,可能出现不安全的问题 对于前 ...
- Java线程:线程的同步-同步方法
Java线程:线程的同步-同步方法 线程的同步是保证多线程安全访问竞争资源的一种手段. 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问 ...
- java并发:线程同步机制之Volatile关键字&原子操作Atomic
volatile关键字 volatile是一个特殊的修饰符,只有成员变量才能使用它,与Synchronized及ReentrantLock等提供的互斥相比,Synchronized保证了Synchro ...
- (转)Java线程:线程的同步与锁
Java线程:线程的同步与锁 一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Fo ...
- Java多线程之线程的同步
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...
- JAVA线程及简单同步实现的原理解析
线程 一.内容简介: 本文主要讲述计算机中有关线程的相关内容,以及JAVA中关于线程的基础知识点,为以后的深入学习做铺垫.如果你已经是高手了,那么这篇文章并不适合你. 二.随笔正文: 1.计算机系统组 ...
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- 浅谈利用同步机制解决Java中的线程安全问题
我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等 ...
随机推荐
- HttpClient 解决中文乱码
public static String httpGet(String url) { try { HttpGet httpGet = new HttpGet(url); HttpClient clie ...
- ROS_Kinetic_11 ROS程序基础Eclipse_C++(二)
ROS_Kinetic_11 ROS程序基础Eclipse_C++(二) 编写简单的Service和Client (C++): http://wiki.ros.org/cn/ROS/Tutorials ...
- Android Wear开发
Android Wear从2014年3月发布到现在已经从1.0发展到2.0(目前还没正式发布).其产品定位也发化了巨大变化,因为Android Wear 1.0通讯方式只有蓝牙,限定了系统,比较依赖手 ...
- Android之BaseAdapter的优雅实现
在android的开发过程中,我们不可避免的要使用ListView来展示我们的Activity上面的内容.你可以使用很多种方式来实现这一功能,但是如何优雅快速的来实现呢?这就是我要写的了,既为了大家共 ...
- Java的字符串分割的不同实现
在java中实现字符串的分割相对而言是很简单的.我们一般会采取两中方式.一个是从jdk1.1就开始的StringTokenizer类,另一个是调用split方法进行分割.下面请看代码: import ...
- EBS Concurrent Manager(并发管理器)异常处理[final]
来自:http://blog.itpub.net/35489/viewspace-742191/ 有时候我们在通过 adstpall.sh 关闭应用后,然后再使用adstrtal.sh开启.发现并发 ...
- Git版本控制:Git冲突解决 相关错误总结
http://blog.csdn.net/pipisorry/article/details/46958699 冲突处理 git push冲突处理 git push时出现冲突:! [rejected] ...
- python 2.4 的字符串转时间(日期减法取间隔时间)
python 2.4中datetime有strftime方法,而无strptime方法.不能对字符串进行格式转换.比如不能将"2013-10-22"转化为日期. 2.4中字符串转日 ...
- Ubuntu14.04安装Matlab2013a
source url: http://blog.sina.com.cn/s/blog_ec5021d60102v3ky.html 1. 为方便操作,把Matlab镜像文件(iso)重命名为'Matla ...
- GitHub前50名的Objective-C动画相关库相关推荐,请自行研究
GitHub的Objective-C的动画UI库其实是最多的一部分,GitHub有相当一部分的动画大牛,如Jonathan George,Nick Lockwood,Kevin,Roman Efimo ...