【Java基础】——之线程同步
来源:互联网 发布:校园网络拓扑结构设计 编辑:程序博客网 时间:2024/06/06 02:12
我们先来看一段代码:
import java.util.ArrayList;public class MyThreadTest {private ArrayList<String> list = new ArrayList<String>();private byte[] lock = new byte[0];private void addData() {list.clear();for (int n = 0; n < 50; n++) {list.add(String.valueOf(n));}System.out.println(list.size());}public static void main(String[] args) {final MyThreadTest mtt = new MyThreadTest();new Thread(new Runnable() {@Overridepublic void run() {mtt.addData();}}).start();new Thread(new Runnable() {@Overridepublic void run() {mtt.addData();}}).start();}}
输出结果:50、50在看一段代码:
import java.util.ArrayList;public class MyThreadTest {private ArrayList<String> list = new ArrayList<String>();private byte[] lock = new byte[0];private void addData() {list.clear();for (int n = 0; n < 5000; n++) {list.add(String.valueOf(n));}System.out.println(list.size());}public static void main(String[] args) {final MyThreadTest mtt = new MyThreadTest();new Thread(new Runnable() {@Overridepublic void run() {mtt.addData();}}).start();new Thread(new Runnable() {@Overridepublic void run() {mtt.addData();}}).start();}}
输出结果:8828、8971(随机的)两份代码有什么区别?只不过是把方法中的循环次数改大了而已,但是显然第二次运行结果就不对了,为什么?
这样就引入了线程同步的概念,第一份代码自身不正确,但是运行结果为什么是正确的呢?因为循环次数过少,线程很快就执行完,所以看上去结果是“正确的”。
当我们把这样的程序引入到银行系统中我们猜猜会发生什么?O(∩_∩)O~
在进一步阐述之前,我们需要明确几点:
A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)与之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
我们看看改如何修改这个程序:
import java.util.ArrayList;public class MyThreadTest {private ArrayList<String> list = new ArrayList<String>();private byte[] lock = new byte[0];synchronized private void addData() {list.clear();for (int n = 0; n < 5000; n++) {list.add(String.valueOf(n));}System.out.println(list.size());}public static void main(String[] args) {final MyThreadTest mtt = new MyThreadTest();new Thread(new Runnable() {@Overridepublic void run() {mtt.addData();}}).start();new Thread(new Runnable() {@Overridepublic void run() {mtt.addData();}}).start();}}当我们让addData()方法加上同步锁了之后,一次只能有一个线程访问addData()对象,其余线程出于等待状态,输出结果为:5000、5000
- 【Java基础】——之线程同步
- Java基础——线程同步通信
- Java基础——线程同步
- Java基础之线程同步与锁
- Java语言基础之线程同步
- java基础:线程同步
- java基础--线程同步
- 【Java】の基础——几种线程同步方式
- 线程基础—线程的同步
- java基础之线程同步实例之Producer与Consumer
- 黑马程序员——java基础拾遗之多线程(二) 线程同步、线程通信
- java之线程同步
- java 线程之同步
- Java线程之线程同步
- Java线程之线程同步
- java线程之线程同步
- Java线程之线程同步
- java线程学习4——线程同步之同步代码块
- Linux FTP 命令全集
- 使用Innosetup制作安装包的一些技巧
- JNI学习积累之一 ---- 常用函数大全
- delphi中建立快捷方式的函数
- Oracle 11g R2 listener.ora&tnsnames.ora Sample
- 【Java基础】——之线程同步
- glReadPixels
- oracle flash query
- VC6.0工程设置介绍
- Python_API_os.path_relpath_待填充
- startup_LPC11xx.s启动代码分析
- 用LUA扩展cpp程序的几个测试
- VC2010 代码字体及颜色设置
- 堆(heap)和栈(stack)、内存泄漏(memory leak)和内存溢出