Java分享笔记:创建多线程 & 线程同步机制
[1] 创建多线程的两种方式
1.1 通过继承Thread类创建多线程
1.定义Thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能。
2.创建子线程的实例对象,相当于新建了一条子线程。
3.调用子线程的start()方法,子线程启动并执行run()方法中的功能。
1.2 通过实现Runnable接口创建多线程
1.定义一个类,实现Runnable接口,重写run()方法,在run()方法体中编写子线程要执行的功能。
2.创建实现类的对象。
3.调用Thread类的有参构造函数,将上述实现类对象作为形参传入,创建Thread类的对象。该对象相当于一条新线程。
4.调用Thread对象的start()方法,子线程启动并执行run()方法中的功能。
[2] 线程同步机制
当多条线程操作共享数据时,会出现线程安全问题。为了解决这一问题,需要保证不同线程在访问同一数据时保持一定的顺序,即“线程的同步机制”。实现该机制有两种方法:同步代码块,同步方法。前者可以指定任意对象作为监视器,后者只能默认使用当前对象作为监视器。故使用同步方法保证线程同步有一定的局限性。
[3] 代码实例
3.1 通过继承Thread类创建多线程,并使用同步代码块的方式保证线程的同步。
//通过继承Thread类的方式创建多线程
//多条线程操作同一个共享资源,存在线程安全问题
//通过同步代码块的方式使线程同步
package pack01; //定义子线程
class SubThread extends Thread { private static int i = 1;
static Object lock = new Object(); //创建静态对象作为监视器 // 子线程要实现的功能:将静态变量i累加到100,并打印每次的累加结果
// 由于多条线程会同时操作静态变量i,故需要保证线程的同步
public void run() { while (true) { synchronized (lock) {
if (i <= 100) {
System.out.println(Thread.currentThread().getName() + "----" + i);
++i; } else {
break;
}
}
} }
} public class MulThread {
public static void main(String[] args) { SubThread st1 = new SubThread();
SubThread st2 = new SubThread(); // 设置线程名称
st1.setName("ONE####");
st2.setName("TWO...."); // 启动线程
st1.start();
st2.start();
}
}
3.2 通过实现Runnable接口创建多线程,使用同步方法保证线程同步。
//通过实现Runnable接口的方式创建多线程
//多条线程操作同一个共享资源,存在线程安全问题
//通过使用同步方法保证线程的同步
package pack01; class Sub implements Runnable{ private static int i=1; //被多条线程共同操作的静态变量 public void run() {
while(true) {
printI();
}
} public synchronized void printI() { //将要需要同步的代码封装进一个同步方法中 if(i<=100) {
System.out.println( Thread.currentThread().getName() + "----" + i );
++i;
} else {
System.exit(0);
}
}
} public class MulThread2 {
public static void main(String[] args) { Sub sub = new Sub(); Thread t1 = new Thread(sub);//将Runnable接口的实现类对象作为参数,传给Thread构造器
Thread t2 = new Thread(sub); t1.setName("ONE####");
t2.setName("TWO...."); t1.start();
t2.start();
}
}
注:希望与各位读者相互交流,共同学习进步。
Java分享笔记:创建多线程 & 线程同步机制的更多相关文章
- Java并发编程:Java中的锁和线程同步机制
		锁的基础知识 锁的类型 锁从宏观上分类,只分为两种:悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新 ... 
- JAVA基础知识之多线程——线程同步
		线程安全问题 多个线程同时访问同一资源的时候有可能会出现信息不一致的情况,这是线程安全问题,下面是一个例子, Account.class , 定义一个Account模型 package threads ... 
- Java多线程编程(4)--线程同步机制
		一.锁 1.锁的概念 线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁 ... 
- Java多线程 | 02 | 线程同步机制
		同步机制简介  线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全.Java平台提供的线程同步机制包括: 锁,volatile关键字,final关键字,static关键字,以 ... 
- Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁
		相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ... 
- Java多线程的同步机制(synchronized)
		一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ... 
- 【总结】Java线程同步机制深刻阐述
		原文:http://hxraid.iteye.com/blog/667437 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread ... 
- Java基础 继承的方式创建多线程 / 线程模拟模拟火车站开启三个窗口售票
		继承的方式创建多线程 笔记: /**继承的方式创建多线程 * 线程的创建方法: * 1.创建一个继承于Thread 的子类 * 2.重写Thread类的run()方法 ,方法内实现此子线程 要完成的功 ... 
- linux学习笔记之线程同步机制
		一.基础知识. 1:线程同步机制:互斥量,读写锁,条件变量,自旋锁,屏障. 1,互斥量:每个进程访问被互斥量保护的资源时,都需要先对互斥量进行判断. 1)互斥量重要属性:进程共享属性,健壮属性,类型属 ... 
随机推荐
- etcd单机集群
			etcd在单机部署集群,可以先弄清楚配置文件参数的意思.起3个集成监听不同的端口号 1. 启动 在/etc/soft/etcd/node1文件夹中,创建脚本start1.sh etcd --name ... 
- python之高阶函数filter
			原文 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返 ... 
- URL工具类
			UrlUtils = { /** * 判断url是否存在(存在跨域问题) * @param {String} url */ isTrueUrl: function(_url) { result = f ... 
- js 正则表达式简易教程
			(http://www.cnblogs.com/tugenhua0707/p/5037811.html#_labe6) 
- Stage3--Python控制流程及函数
			说在前面: Stage1-Stage4简单介绍一下Python语法,Stage5开始用python实现一些实际应用,语法的东西到处可以查看到,学习一门程序语言的最终目的是应用,而不是学习语法,语法本事 ... 
- Java & COM
- ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证
			在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证.字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数 ... 
- 三、python webservice
			#!/usr/bin/python # -*- coding: utf-8 -*- import logging import suds url="http://172.17.2.199:8 ... 
- 数据结构与算法分析java——散列
			1. 散列的概念 散列方法的主要思想是根据结点的关键码值来确定其存储地址:以关键码值K为自变量,通过一定的函数关系h(K)(称为散列函数),计算出对应的函数值来,把这个值解释为结点的存储地址,将结点存 ... 
- listview加载显示图片
			public class ImageAndTextListAdapter extends ArrayAdapter<ImageAndText> { private ListView lis ... 
