- 浏览: 585511 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (423)
- windows2003 (1)
- exception (3)
- java (91)
- eclipse (14)
- java web (3)
- javaScript (11)
- 装机 (1)
- sql (34)
- outlook (1)
- html (8)
- JAVA 不同区域服务器引起的乱码解决 (2)
- strtus (3)
- http (1)
- 设计模式 (4)
- Java对存储过程的调用方法 (0)
- java-数据库操作 (0)
- jdbc (7)
- dwr (2)
- 软件版本号 (1)
- jxls (1)
- ExtJS (3)
- Ajax (1)
- git (12)
- linux (20)
- mysql (14)
- maven (16)
- easyui (1)
- 日常备注 (1)
- spring (9)
- others (1)
- windows快捷键 (1)
- 工作备注 (9)
- 工作杂项 (0)
- photoshop (1)
- 开发环境配置 (0)
- jboss (1)
- 报表 (1)
- 图表 (1)
- fckeditor (1)
- 调试bug (2)
- 口令 (1)
- css (2)
- mongodb (7)
- restful (1)
- jsp (5)
- jpa (2)
- bug (1)
- js (2)
- Json (1)
- POI (1)
- xml (2)
- webstorm (1)
- java swing (1)
- ubuntu (3)
- mongo (27)
- 自我学习 (0)
- 草稿 (0)
- 单元测试 (1)
- 数据库 (2)
- ide (1)
- 大数据 (0)
- uml (1)
- spring-boot (1)
- mybatis (3)
- oracle (2)
- jetty (1)
- 学习 (0)
- 系统调优 (1)
- tomcat (2)
- kettle (1)
- 学习资源 (1)
- 架构 (2)
- database (4)
- idea (1)
- consul (1)
- hadoop (2)
- nginx (3)
- 认证 (1)
- 加密 (1)
- connection pool (1)
- loadrunner (1)
- tps (1)
- 翻墙工具 (1)
- redis (2)
- redis jedis shardjedis (1)
- spring boot (1)
- 认证授权 (1)
- ssh (1)
- svn (2)
- 多线程 (1)
最新评论
-
abcdeudi:
不错
接口和抽象类什么时候使用才合适? -
羽翼的心动:
POI中对Word处理,读取不到书签。如果要处理书签的话,就只 ...
POI根据模板(excel表头)导出excel -
pdf1192012:
高质量文章
接口和抽象类什么时候使用才合适? -
沐忆潼:
...
POI根据模板(excel表头)导出excel -
422937561:
高质量文章
接口和抽象类什么时候使用才合适?
一)线程的同步
1、在一个程序中,代码段访问了同一个对象从单独的、并发的线程当中,这个代码段就
叫做“临界区”。采用同步的机制对临界区进行保护。
2、同步的两种方式:同步块和同步方法。这两种方式都是通过一个synchronized关键字
来完成的。
A.对于同步块来说,在synchronized后面需要加上一个对象,这个对象是任意的一个
对象。可以定义一个String类型的,也可以定义一个Object类型的对象:
Object obj = new Object();
在synchronized后面加上这个对象:
synchronized(obj)
{
//保护的代码段
……
}
这样就实现了一个同步。
B.*同步方法的实现:
在方法的前面加上synchronized
Public synchronized void method1()
{
}
同步的方法可以完成跟同步块一样的结果。同步块需要有一个对象,同步方法只需要
在方法的前面加上一个synchronized关键字。
3、同步块的实现机制是怎样完成的呢?java语言中每一个对象都有一个监视器,或者叫
做锁。当我们第一个线程进来的时候首先要判断一下obj这个对象的监视器是否被加
锁,如果没有被加锁,那么它就会将obj的监视器加锁,然后往下执行(遇到sleep
睡眠)…如果其它线程执行到Synchronized会判断到obj已经被加锁,那么它们只能
等待。第一个线程执行完受保护的代码后,会将obj的监视器解锁。其它线程就可以
进入到这个同步的代码段中。
同步方法的实现机制又是怎样的呢?当我们一个线程进入这个方法的时候,也需要加
上一把锁,同步的方法是给类中的this变量的监视器加锁。当一个线程进入同步方法
的时候,会察看this对象是否加锁,没有加锁则会加锁。然后进入到方法内部,方法
执行完后,会将this解锁,其它线程在this解锁后才可以进入。
4、同步方法利用的是this所代表的对象的锁。
5、因为静态方法只属于类本身,而不属于某个对象。每个类都对应有一个class对象,同
步静态方法使用的就是方法所在的类所对应的class对象的监视器。
二)线程的死锁
1、 哲学家进餐的问题。
2、 线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。
3、 Thread类中两个废弃的方法就很容易造成死锁,suspend()、resume()
Wait、notify、nofityAll方法
1、 每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的等待队列是空的。
2、我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。也就是说wait方法只能够在同步方法或者同步块中被调用。但我们调用wait方法的时候,这个线程就进入了这个对象的等待队列当中。
3、 当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
4、 当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
5、 Wait和notify主要用于producer-consumer这种关系中。
6、 Wait和notify方法必须在一个同步的块或者方法中被调用,并且针对同一对象的等待队列
三)线程的状态
1、 用new创建一个线程的时候,线程就处于new状态。
当调用start方法的时候,线程处于可运行(Runnable)状态。
一个尚未运行的线程是Runnable状态,一个正在运行的线程也是Runnable状态。
当一个正在运行的线程调用yield方法的时候,线程调度器会选择另外一个线程去运行,调用yield方法的线程仍然处于Runnable状态。
当我们调用sleep、wait、suspend或者I/O阻塞时线程就进入Not Runnable状态。当一个线程sleep结束,或者调用了notify方法、resume方法或者I/O操作完成,线程就会从Not Runnable状态返回Runnable状态。
(resume和suspend这两个函数已经被废弃了,不建议我们再使用)
当一个处于可运行状态的线程它的run方法执行完毕或者调用stop方法,线程就进入了Dead状态终止了。
在Not Runnable状态的时候,调用了stop方法,线程也会终止。
(stop方法是用来停止一个线程的,这个方法也已经废弃了,因为这个方法是不安全的,当调用stop方法时,它会解锁先前锁住的所有的监视器,这样的话,其它的线程就可以去访问被保护的对象,导致对象的状态不一致,结果是不可预料的)
四)线程的终止(两种方式)
1、 设置一个flag变量
需要注意的是,当上面代码中的Thread1 类的run()方法如果调用了wait()方法,如下代码。t1线程将无法结束。
2、 interrupt()方法(可以中断一个线程)
解决上面的问题的办法可以使用interrupt()方法。
五)购买火车票模型
六)生产者和消费者模型
资料网址:http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html
摘自:http://hi.baidu.com/mylife722/blog/item/533c87145b4f284621a4e920.html
1、在一个程序中,代码段访问了同一个对象从单独的、并发的线程当中,这个代码段就
叫做“临界区”。采用同步的机制对临界区进行保护。
2、同步的两种方式:同步块和同步方法。这两种方式都是通过一个synchronized关键字
来完成的。
A.对于同步块来说,在synchronized后面需要加上一个对象,这个对象是任意的一个
对象。可以定义一个String类型的,也可以定义一个Object类型的对象:
Object obj = new Object();
在synchronized后面加上这个对象:
synchronized(obj)
{
//保护的代码段
……
}
这样就实现了一个同步。
B.*同步方法的实现:
在方法的前面加上synchronized
Public synchronized void method1()
{
}
同步的方法可以完成跟同步块一样的结果。同步块需要有一个对象,同步方法只需要
在方法的前面加上一个synchronized关键字。
3、同步块的实现机制是怎样完成的呢?java语言中每一个对象都有一个监视器,或者叫
做锁。当我们第一个线程进来的时候首先要判断一下obj这个对象的监视器是否被加
锁,如果没有被加锁,那么它就会将obj的监视器加锁,然后往下执行(遇到sleep
睡眠)…如果其它线程执行到Synchronized会判断到obj已经被加锁,那么它们只能
等待。第一个线程执行完受保护的代码后,会将obj的监视器解锁。其它线程就可以
进入到这个同步的代码段中。
同步方法的实现机制又是怎样的呢?当我们一个线程进入这个方法的时候,也需要加
上一把锁,同步的方法是给类中的this变量的监视器加锁。当一个线程进入同步方法
的时候,会察看this对象是否加锁,没有加锁则会加锁。然后进入到方法内部,方法
执行完后,会将this解锁,其它线程在this解锁后才可以进入。
4、同步方法利用的是this所代表的对象的锁。
5、因为静态方法只属于类本身,而不属于某个对象。每个类都对应有一个class对象,同
步静态方法使用的就是方法所在的类所对应的class对象的监视器。
二)线程的死锁
1、 哲学家进餐的问题。
2、 线程1锁住了对象A的监视器,等待对象B的监视器,线程2锁住了对象B的监视器,等待对象A的监视器,就造成了死锁。
3、 Thread类中两个废弃的方法就很容易造成死锁,suspend()、resume()
Wait、notify、nofityAll方法
1、 每一个对象除了有一个锁之外,还有一个等待队列(wait set),当一个对象刚创建的时候,它的等待队列是空的。
2、我们应该在当前线程锁住对象的锁后,去调用该对象的wait方法。也就是说wait方法只能够在同步方法或者同步块中被调用。但我们调用wait方法的时候,这个线程就进入了这个对象的等待队列当中。
3、 当调用对象的notify方法时,将从该对象的等待队列中删除一个任意选择的线程,这个线程将再次成为可运行的线程。
4、 当调用对象的notifyAll方法时,将从该对象的等待队列中删除所有等待的线程,这些线程将成为可运行的线程。
5、 Wait和notify主要用于producer-consumer这种关系中。
6、 Wait和notify方法必须在一个同步的块或者方法中被调用,并且针对同一对象的等待队列
三)线程的状态
1、 用new创建一个线程的时候,线程就处于new状态。
当调用start方法的时候,线程处于可运行(Runnable)状态。
一个尚未运行的线程是Runnable状态,一个正在运行的线程也是Runnable状态。
当一个正在运行的线程调用yield方法的时候,线程调度器会选择另外一个线程去运行,调用yield方法的线程仍然处于Runnable状态。
当我们调用sleep、wait、suspend或者I/O阻塞时线程就进入Not Runnable状态。当一个线程sleep结束,或者调用了notify方法、resume方法或者I/O操作完成,线程就会从Not Runnable状态返回Runnable状态。
(resume和suspend这两个函数已经被废弃了,不建议我们再使用)
当一个处于可运行状态的线程它的run方法执行完毕或者调用stop方法,线程就进入了Dead状态终止了。
在Not Runnable状态的时候,调用了stop方法,线程也会终止。
(stop方法是用来停止一个线程的,这个方法也已经废弃了,因为这个方法是不安全的,当调用stop方法时,它会解锁先前锁住的所有的监视器,这样的话,其它的线程就可以去访问被保护的对象,导致对象的状态不一致,结果是不可预料的)
四)线程的终止(两种方式)
1、 设置一个flag变量
class TestThread { public static void main(String[] args) { Thread1 t1=new Thread1(); t1.start(); int index=0; while(true) { if(index++==500) { t1.stopThread(); break; } System.out.println(Thread.currentThread().getName()); } System.out.println("main() exit"); } } class Thread1 extends Thread { private boolean bStop=false; public void run() { while(!bStop) { System.out.println(getName()); } } public void stopThread() { bStop=true; } }
需要注意的是,当上面代码中的Thread1 类的run()方法如果调用了wait()方法,如下代码。t1线程将无法结束。
class TestThread { public static void main(String[] args) { Thread1 t1=new Thread1(); t1.start(); int index=0; while(true) { if(index++==500) { t1.stopThread(); break; } System.out.println(Thread.currentThread().getName()); } System.out.println("main() exit"); } } class Thread1 extends Thread { private boolean bStop=false; public synchronized void run() { while(!bStop) { try{ wait(); } catch (Exception e) { e.printStackTrace(); } System.out.println(getName()); } } public void stopThread() { bStop=true; } }
2、 interrupt()方法(可以中断一个线程)
解决上面的问题的办法可以使用interrupt()方法。
class TestThread { public static void main(String[] args) { Thread1 t1=new Thread1(); t1.start(); int index=0; while(true) { if(index++==500) { t1.stopThread(); t1.interrupt(); break; } System.out.println(Thread.currentThread().getName()); } System.out.println("main() exit"); } } class Thread1 extends Thread { private boolean bStop=false; public synchronized void run() { while(!bStop) { try { wait(); } catch(InterruptedException e) { //e.printStackTrace(); if(bStop) return; } System.out.println(getName()); } } public void stopThread() { bStop=true; } }
五)购买火车票模型
class TicketsSystem { public static void main(String[] args) { SellThread st=new SellThread(); new Thread(st).start(); try { Thread.sleep(1); } catch(Exception e) { e.printStackTrace(); } st.b=true; new Thread(st).start(); //new Thread(st).start(); //new Thread(st).start(); } } class SellThread implements Runnable { int tickets=100; Object obj=new Object(); boolean b=false; public void run() { if(b==false) { while(true) sell(); } else { while(true) { synchronized(obj) { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } synchronized(this) { if(tickets>0) { System.out.println("obj:"+Thread.currentThread().getName()+ " sell tickets:"+tickets); tickets--; } } } } } } public synchronized void sell() { synchronized(obj) { if(tickets>0) { try { Thread.sleep(10); } catch(Exception e) { e.printStackTrace(); } System.out.println("sell():"+Thread.currentThread().getName()+ " sell tickets:"+tickets); tickets--; } } } }
六)生产者和消费者模型
class Test { public static void main(String[] args) { Queue q=new Queue();// Producer p=new Producer(q);// Consumer c=new Consumer(q);// p.start(); c.start(); } } class Producer extends Thread { Queue q; Producer(Queue q) { this.q=q; } public void run() { for(int i=0;i<10;i++) { q.put(i); System.out.println("Producer put "+i); } } } class Consumer extends Thread { Queue q; Consumer(Queue q) { this.q=q; } public void run() { while(true) { System.out.println("Consumer get "+q.get()); } } } class Queue { int value; boolean bFull=false; public synchronized void put(int i) {// if(!bFull) { value=i; bFull=true; notify();//在这里,wait()和notify()实现了不同代码块间的同步。即实现了put(int i)方法和get()方法的同步. } try { wait();//在这里,wait()和notify()实现了不同代码块间的同步。即实现了put(int i)方法和get()方法的同步. } catch(Exception e) { e.printStackTrace(); } } public synchronized int get()// { if(!bFull) { try { wait();//在这里,wait()和notify()实现了不同代码块间的同步。即实现了put(int i)方法和get()方法的同步. } catch(Exception e) { e.printStackTrace(); } } bFull=false; notify();//在这里,wait()和notify()实现了不同代码块间的同步。即实现了put(int i)方法和get()方法的同步. return value; } }
资料网址:http://java.sun.com/docs/books/jls/second_edition/html/jTOC.doc.html
摘自:http://hi.baidu.com/mylife722/blog/item/533c87145b4f284621a4e920.html
发表评论
-
文件上传
2017-02-05 09:47 408文件上传模块 -
@ModelAttribute注解的使用
2017-01-09 23:13 538https://my.oschina.net/u/176085 ... -
数组合并和判断数组包含某个元素
2017-01-09 23:10 537http://www.iteye.com/news/28296 ... -
项目创建流程
2017-01-09 23:06 403http://lion.newtouch.com/pages/ ... -
mysql 出现很多连接 sleep 问题
2017-01-09 23:00 708http://blog.csdn.net/lin_credib ... -
spring boot 学习
2016-11-28 17:05 382http://412887952-qq-com.iteye.c ... -
jxls excel上传数据
2016-11-22 15:27 553http://jxls.sourceforge.net/ref ... -
veloctiyengine gettemplate jsonobject.fromobject
2016-11-18 10:41 0/** 53. * test User 54. ... -
HDFS客户端的权限错误:Permission denied
2016-08-09 01:55 630http://www.linuxidc.com/Linux/2 ... -
java map中的key为object
2016-08-08 11:18 529http://zhidao.baidu.com/link?ur ... -
jdbc pool
2016-07-26 14:50 408[url]C:\Users\lwx328240\Desktop ... -
java 域是指什么
2016-07-15 15:36 532http://blog.csdn.net/iaiti/arti ... -
java jdbc/ojdbc 链接oracle的三种方式
2016-07-12 14:50 579http://blog.itpub.net/22664653/ ... -
java 编译器 解释器
2016-06-28 14:45 7150) javac 编译器 用于将java源代码文件编译成字节码 ... -
linux查看cpu、内存、版本信息
2016-06-24 21:44 542http://blog.chinaunix.net/uid-2 ... -
重定向控制台System.out.println输出到文件,再重定向回控制台
2016-06-24 20:18 510http://blog.csdn.net/jason_deng ... -
java 代码点 代码单元
2016-06-24 09:38 723http://blog.csdn.net/weizhaozhe ... -
java 日期
2016-06-24 09:39 349http://kingquake21.iteye.com/bl ... -
jdbc addBatch
2016-06-23 22:08 403http://www.360sdn.com/java/2014 ... -
java中的arrayList(动态数组)与静态数组
2016-06-21 20:26 948http://www.2cto.com/kf/201206/1 ...
相关推荐
7. **多线程**:Java内置了对多线程的支持,笔记可能会讲解Thread类的使用,线程同步机制(如synchronized,wait(),notify()等)以及并发工具类(如ExecutorService,Semaphore等)。 8. **接口与抽象类**:Java中...
这份"java复习笔记"旨在帮助学习者系统地回顾和深入理解Java的关键概念和技术,以便于提升编程技能和应对各种开发挑战。 一、基础语法 Java的基础语法包括变量、数据类型、运算符、流程控制语句等。例如,变量是...
本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...
【Java学习笔记——全面解析】 Java作为一种广泛应用的高级编程语言,是软件开发领域的核心力量。这份"学习笔记——资料"涵盖了Java学习的各个方面,旨在帮助初学者和有经验的开发者巩固基础,提升技能。以下是对这...
【描述】中的“大学生Java学习笔记,复习巩固,课程大作业,课程设计,期末复习”暗示了这个项目是学生学习过程中的一个重要部分,它可能包括了课堂所学的全部Java概念和技术,如面向对象编程、类与对象、继承、多态...
- **多线程**:Java原生支持多线程编程,这使得开发者可以轻松地编写并发程序。 - **Java与平台无关性的实现**: - Java源代码通过`javac`命令被编译成字节码文件(.class),这些字节码文件可以在任何支持JVM的...
这一篇文章主要关于java多线程,主要还是以例子来驱动的。因为讲解多线程的书籍和文章已经很多了,所以我也不好意思多说,呵呵、大家可以去参考一些那些书籍。我这个文章主要关于实际的一些问题。同时也算是我以后...
以下是基于描述中提到的两个文件——"Java基础每日复习笔记-JavaSE基础阶段.edf"和"Java基础每日复习笔记-JavaSE高级阶段.edf"——所包含的知识点的详细阐述: 1. **Java SE基础阶段**: - **Java简介**:了解Java...
【描述】"大学生JAVA学习笔记,复习巩固,课程作业,课程设计" 暗示这可能是某个大学课程的一部分,学生通过这个项目来实践Java编程和Android应用开发的知识。这可能涵盖了从基础概念到高级特性的全面学习,如UI设计...
3. **java解惑.pdf**:这很可能与博客主题相呼应,详细解答了Java编程中的疑惑,比如异常处理、多线程、集合框架、内存管理等复杂话题。 4. **网络安全防护措施百分百.ppt**:网络安全是任何应用开发都不可忽视的...
这些材料可能涉及从基础语法、面向对象编程概念,到高级特性如多线程、网络编程、I/O流、集合框架、异常处理等全面的Java知识体系。 【标签】"java"明确指出了文件内容的主题,Java是一种广泛使用的编程语言,尤其...
1. **题库模拟**:模拟机通常包含大量的模拟试题,覆盖了SCJP考试的所有知识点,如基本语法、类与对象、异常处理、多线程、集合框架、I/O流、反射等。这些题目旨在帮助考生熟悉考试的题型和难度,提高答题速度。 2....
- **Dispatcher**:引入分发器以支持多线程处理请求。 通过以上详细的解析,我们可以看到,“学习方法归纳”不仅仅是一份简单的学习指南,它提供了从理论到实践、从基础知识到高级应用的一整套系统化学习路径。...
软件可能包括各种题型,如选择题、填空题和编码题,覆盖了SCJP考试的所有知识点,如Java语法、面向对象编程、异常处理、多线程、集合框架、I/O流等。 此外,软件可能还具备智能化的功能,如自适应练习、错题分析和...
"Midterm"通常涉及到对学期内学到的概念、原理和技术的测试,所以我们可以期待这个压缩包中包含了与Java编程基础、语法、数据结构、算法、面向对象编程等多方面的内容。 【描述】中没有提供具体的信息,所以我们...