重学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 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 程序员的上下文是什么? 很多时候一大部分编程开发的人员都只是关注于功能的实现,只 ...
随机推荐
- 浅析Java内存模型
概述 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节.此处的变量是线程共享的,存在竞争问题的. Java内存模型规定了所有的变量 ...
- quartus使用笔记
quartus中默认顶层文件名与工程名相同,或自行设置顶层文件:project->set as top-leval entity 顶层模块名要与工程名相同 RTL是编译后的结果,并没有与实际的硬 ...
- c# (nop中)下拉列表(有外键)
第一种情况.view视图加载出来时就有值,实现步骤如下 1.在操作的界面Model中建立public List<SelectListItem> xxx(取名){ get; set; } 2 ...
- App lifecycle(UWP深入学习一)
https://msdn.microsoft.com/en-us/library/windows/desktop/br211474.aspx Launching, resuming, and back ...
- Linux 查杀进程
ps -eaf |grep "stoporder.php" | grep -v "grep"| awk '{print $2}'|xargs kill -9 # ...
- smartimageview使用与实现原理
一.从网络中获取图片的步骤 从网络中获取图片是一个耗时耗资源耗费用户流量的操作,故我们在第一次获取到网络中图片的时候会将其缓存到本地(内存或SD卡),以保证下次再需要这张图片时,可以从本地加载到. 二 ...
- c# XML序列化与反序列化 属性字段标识
序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAt ...
- tomcat 虚拟主机配置
1.虚拟主机 服务器接收到客户端请求时,会根据HTTP请求报文中的HOST头选择web站点进行响应.发送请求时,url中的主机名会被作为HTTP请求报文中的HOST发送给服务器.因此,可以根据不同的H ...
- SVM 简要推导过程
SVM 是一块很大的内容,网上有写得非常精彩的博客.这篇博客目的不是详细阐述每一个理论和细节,而在于在不丢失重要推导步骤的条件下从宏观上把握 SVM 的思路. 1. 问题由来 SVM (支持向量机) ...
- Wordnet的一些简单使用
转载请说明出处:http://www.cnblogs.com/KingKou/p/4121373.html 1.简介 Wordnet是一个由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下 ...