重学JAVA基础(六):多线程的同步
1.synchronized关键字
/**
* 同步关键字
* @author tomsnail
* @date 2015年4月18日 下午12:12:39
*/
public class SyncThreadTest { private static final byte[] lock = new byte[1]; /**
* 同步方法
* @author tomsnail
* @date 2015年4月18日 下午12:15:30
*/
public synchronized void test1(){ } /**
* 同步块
* @author tomsnail
* @date 2015年4月18日 下午12:15:17
*/
public void test2(){
synchronized (lock) { }
} }
2.volatile关键字
/**
* volatile关键字
* @author tomsnail
* @date 2015年4月18日 下午12:21:58
*/
public class VolatileThreadTest { private volatile int count = 100; public void add(int number){
count+=number;
} public int getCount(){
return count;
}
}
3.Lock锁
/**
* lock锁
* @author tomsnail
* @date 2015年4月18日 下午12:58:49
*/
public class LockThreadTest { private Lock lock = new ReentrantLock(); private int count = 100; public void test(){
lock.lock();
count++;
System.out.println(count);
lock.unlock();
} }
4.Mutex信号量
/**
* 线程信号量
* @author tomsnail
* @date 2015年4月18日 下午1:14:47
*/
public class MutexThreadTest { private CountDownLatch countDownLatch = new CountDownLatch(1); private Semaphore s = new Semaphore(5); public void a(){
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void b(){
countDownLatch.countDown();
} public void c(){
try {
System.out.println(" try acquire s");
s.acquire();
System.out.println(" acquire s");
} catch (InterruptedException e) {
e.printStackTrace();
}
} public void d(){
s.release();
System.out.println(" release s");
} public static void main(String[] args) {
MutexThreadTest mutexThreadTest = new MutexThreadTest();
for(int i=0;i<10;i++){
new Thread(new ThreadTest(mutexThreadTest)).start();
}
mutexThreadTest.a();
System.out.println("a...");
for(int i=0;i<10;i++){
new Thread(new ThreadTest2(mutexThreadTest)).start();
} } }
class ThreadTest implements Runnable{ private MutexThreadTest mutexThreadTest; public ThreadTest(MutexThreadTest mutexThreadTest){
this.mutexThreadTest = mutexThreadTest;
} @Override
public void run() {
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("mutexThreadTest countDown");
mutexThreadTest.b();
} } class ThreadTest2 implements Runnable{ private MutexThreadTest mutexThreadTest; public ThreadTest2(MutexThreadTest mutexThreadTest){
this.mutexThreadTest = mutexThreadTest;
} @Override
public void run() {
mutexThreadTest.c();
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
mutexThreadTest.d();
} }
重学JAVA基础(六):多线程的同步的更多相关文章
- 重学JAVA基础(八):锁的基本知识
1.线程状态 如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态.这个过程 ...
- 重学JAVA基础(五):面向对象
1.封装 import java.util.Date; public class Human { protected String name; protected BirthDay birthDay; ...
- 重学JAVA基础(二):Java反射
看一下百度的解释: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息 ...
- 重学JAVA基础(一):PATH和CLASSPATH
我想大多数Java初学者都会遇到的问题,那就是怎么配置环境,执行java -jar xxx.jar 都会报NoClassDefFindError,我在最开始学习的时候,也遇到了这些问题. 1.PAT ...
- 重学JAVA基础(七):线程的wait、notify、notifyAll、sleep
/** * 测试thread的wait notify notifyAll sleep Interrupted * @author tomsnail * @date 2015年4月20日 下午3:20: ...
- 重学JAVA基础(四):线程的创建与执行
1.继承Thread public class TestThread extends Thread{ public void run(){ System.out.println(Thread.curr ...
- 重学JAVA基础(三):动态代理
1.接口 public interface Hello { public void sayHello(); } 2.实例类 public class Hello2 { public void sayH ...
- 重学 Java 设计模式:实战抽象工厂模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- 重学 Java 设计模式:实战享元模式「基于Redis秒杀,提供活动与库存信息查询场景」
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...
随机推荐
- redis Transaction支持
前面主要介绍了redis数据类型,这里讲下事务问题 NoSQL都不支持事务,虽然Redis的Transactions提供的并不是严格的ACID的事务(比如一串用EXEC 提交执行的命令,在执行中服务器 ...
- mysql 4种启动方式
mysql 4种启动方式 都是去调用mysqld文件 1. mysqld 启动 进入mysqld文件所在目录(/../libexec/mysqld) ./mysqld --defaults-file= ...
- 安装数据库出现错误vc_red.msi找不到
用虚拟光驱安装数据的时候可能会出现,找不到vc_red.msi的问题,通过加载的虚拟光驱目录设置,可能 仍然后问题,比如程序停止运行. 解决方法是:解压iso文件,用解压后的文件安装.然后在解压文件夹 ...
- jquery实现div遮罩层
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- c# 调用分页(控制器端的)与时间的格式
1.在操作的model中: 2.在控制器中: , command.PageSize);//将从数据库获取到的集合进行分页 var gridModel = new DataSourceResult { ...
- Hibernate框架—简介
ORM对象/关系数据库映射 ORM全称Object/Relation Mapping,对象/关系数据库映射,可以理解成一种规范.该框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射. ORM ...
- xcode添加音效
xcode添加背景音乐/音效 背景音乐:http://www.cnblogs.com/jiayongqiang/p/5476069.html 音效: 一.介绍: 又称“短音频”,通常在程序中的播放时长 ...
- Linux -- Centos 下配置LNAMP 服务器环境
1.Mysql centos 7 下mysql被替换掉,如有需要请看另一篇: centos 6.5下: yum install mysql mysql-server mysql-devel 启动mys ...
- (转)深入理解PHP之数组(遍历顺序)
深入理解PHP之数组(遍历顺序)(转) http://www.laruence.com/2009/08/23/1065.html (鸟哥) 经常会有人问我, PHP的数组, 如果用foreach来访问 ...
- tomee 系列问题
1. remote client 无法建立连接 修改system.properties # allowed packages to be deserialized, by security we de ...