当前位置: 首页 > news >正文

上海商城网站开发网站开发图标下载

上海商城网站开发,网站开发图标下载,南通专业网站设计制作,免费网页空间申请一、线程同步 1、线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏。2、线程同步方法是通过锁来实现#xff0c;每个对象都有切仅有一个锁#xff0c;这个锁与一个特定的对象关联#xff0c;线程一旦获取了对象锁#xff0c;其他访问该对象的线程就无法再访问该…一、线程同步 1、线程同步的目的是为了保护多个线程访问一个资源时对资源的破坏。 2、线程同步方法是通过锁来实现每个对象都有切仅有一个锁这个锁与一个特定的对象关联线程一旦获取了对象锁其他访问该对象的线程就无法再访问该对象的其他同步方法。 二、实现同步机制的两个方法 1。同步代码块 synchronized(同一个数据){} 同一个数据就是N条线程同时访问一个数据。 2。 同步方法 public synchronized 数据返回类型 方法名(){} 就是使用 synchronized 来修饰某个方法则该方法称为同步方法。对于同步方法而言无需显示指定同步监视器同步方法的同步监视器是 this 也就是该对象的本身这里指的对象本身有点含糊其实就是调用该同步方法的对象通过使用同步方法可非常方便的将某类变成线程安全的类具有如下特征 1该类的对象可以被多个线程安全的访问。 2每个线程调用该对象的任意方法之后都将得到正确的结果。 3每个线程调用该对象的任意方法之后该对象状态依然保持合理状态。 注synchronized关键字可以修饰方法也可以修饰代码块但不能修饰构造器属性等。 实现同步机制注意以下几点 安全性高性能低在多线程用。性能高安全性低在单线程用。  关键代码如下 编写打印机类Printer  定义两个方法 package cn.d.happy;public class Printer {Object onew Object();//或在void前加synchronizedpublic void print1(){//同步代码块synchronized (o){System.out.print(线);System.out.print(程);System.out.print(同);System.out.print(步);System.out.println();}}public void print2(){synchronized (o){System.out.print(噢);System.out.print(呵);System.out.println();}} } 定义两个线程类 并重写run方法。继承Thread 和 实现Runnable接口 通过for循环遍历次数 package cn.d.happy;public class MyThread extends Thread{public Printer print;Override public void run() {//必须有该类的对象实例for (int i 1; i 10; i) {print.print1();} } } package cn.d.happy;public class MyThread2 implements Runnable{public Printer print;Overridepublic void run() {for (int i 1; i 10; i) {print.print2();}}} 测试类 创建打印机对象  以及两个线程对象并进行赋值 package cn.d.happy;public class Test { public static void main(String[] args) {//购买一个打印机Printer pnew Printer();//创建第一个线程对象 并且给属性赋值MyThread t1new MyThread();t1.printp;t1.start();//03.创建第二个线程对象 并且给属性赋值MyThread2 t2new MyThread2();t2.printp;Thread ttnew Thread(t2);tt.start(); } } 实现效果   三、Java多线程之yield()、wait()、Notify()、Notifyall() yield()、 1)    通过yield ()函数可使线程进入可执行状态排程器从可执行状态的线程中重新进行排程。所以调用了yield()的函数也有可能马上被执行。2)    当调用yield ()函数后线程不会释放它的“锁标志”。 class TestThreadMethod extends Thread{public static int shareVar 0;public TestThreadMethod(String name){super(name);}public synchronized void run(){for(int i0; i4; i){System.out.print(Thread.currentThread().getName());System.out.println( : i);Thread.yield();}}}public class TestThread{public static void main(String[] args){TestThreadMethod t1 new TestThreadMethod(t1);TestThreadMethod t2 new TestThreadMethod(t2);t1.start();t1.start(); //1//t2.start(); 2} 运行结果为t1 : 0t1 : 1t1 : 2t1 : 3t1 : 0t1 : 1t1 : 2t1 : 3从结果可知调用yield()时并不会释放对象的“锁标志”。如果把代码1注释掉并去掉代码2的注释结果为t1 : 0t1 : 1t2 : 0t1 : 2t2 : 1t1 : 3t2 : 2t2 : 3从结果可知虽然t1线程调用了yield()但它马上又被执行了。   wait与notify是java同步机制中重要的组成部分。结合与synchronized关键字使用可以建立很多优秀的同步模型。 synchronized(this){ }等价于publicsynchronized void method(){.....} 同步分为类级别和对象级别分别对应着类锁和对象锁。类锁是每个类只有一个如果static的方法被synchronized关键字修饰则在这个方法被执行前必须获得类锁对象锁类同。   首先调用一个Object的wait与notify/notifyAll的时候必须保证调用代码对该Object是同步的也就是说必须在作用等同于synchronized(obj){......}的内部才能够去调用obj的wait与notify/notifyAll三个方法否则就会报错  java.lang.IllegalMonitorStateException:current thread not owner  在调用wait的时候线程自动释放其占有的对象锁同时不会去申请对象锁。当线程被唤醒的时候它才再次获得了去获得对象锁的权利。  所以notify与notifyAll没有太多的区别只是notify仅唤醒一个线程并允许它去获得锁notifyAll是唤醒所有等待这个对象的线程并允许它们去获得对象锁只要是在synchronied块中的代码没有对象锁是寸步难行的。其实唤醒一个线程就是重新允许这个线程去获得对象锁并向下运行。    notifyAll虽然是对每个wait的对象都调用一次notify但是这个还是有顺序的每个对象都保存这一个等待对象链调用的顺序就是这个链的顺序。其实启动等待对象链中各个线程的也是一个线程在具体应用的时候需要注意一下。   wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能。因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。 wait(): 等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过但运行时会收到一个异常IllegalMonitorStateException。 调用任意对象的 wait() 方法导致该线程阻塞该线程不可继续执行并且该对象上的锁被释放。 notify(): 唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候并不能确切的唤醒某一个等待状态的线程而是由JVM确定唤醒哪个线程而且不是按优先级。 调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞但要等到获得锁后才真正可执行。 notifyAll(): 唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。   通常多线程之间需要协调工作如果条件不满足则等待当条件满足时等待该条件的线程将被唤醒。在Java中这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的。 例如   synchronized(obj) {while(!condition) {obj.wait();}obj.doSomething();}   当线程A获得了obj锁后发现条件condition不满足无法继续下一处理于是线程A就wait()。在另一线程B中如果B更改了某些条件使得线程A的condition条件满足了就可以唤醒线程A synchronized(obj) {condition true;obj.notify();} synchronized和wait()、notify()等的关系:  1.有synchronized的地方不一定有wait,notify 2.有wait,notify的地方必有synchronized.这是因为wait和notify不是属于线程类而是每一个对象都具有的方法而且这两个方法都和对象锁有关有锁的地方必有synchronized。 另外注意一点如果要把notify和wait方法放在一起用的话必须先调用notify后调用wait因为如果调用完wait该线程就已经不是currentthread了。           转载于:https://www.cnblogs.com/WJ-163/p/5770304.html
http://www.pierceye.com/news/939944/

相关文章:

  • wordpress网站外包浙江省建设厅新网站人员无法查询
  • 广州天与地网站建设石家庄快速建站公司
  • 汕头投资建设总公司网站专做PPP项目网站
  • 双语教学示范课程建设项目网站建设通网站上线
  • 电子商务网站域名注册要求南京电商设计
  • 网站左侧导航设计国内免费服务器地址
  • 怎样上网站dns解析不了图片墙网站源码
  • 东莞网站建设多少钱玩网页游戏的网站
  • 做网上竞猜网站合法吗珠海移动网站建设费用
  • 电视剧手机网站大全网页版微信二维码付款怎么弄
  • 亳州有做网站的吗一站式快速网站排名多少钱
  • 国外数码印花图案设计网站秦皇岛信息平台
  • 网站建设仿站纪念册设计制作公司
  • 西安烽盈网站建设有人上相亲网站做传销燕窝
  • 您身边的网站建设专家四川省建设注册资格中心网站
  • 东莞公司网站做优化做企业网站的合同
  • 网站域名空间怎么提交北京公司网站制作方法
  • 网站伪静态是什么意思中国知名网站排行榜
  • 国外网站注册软件用python做购物网站
  • 网站设计 素材如何攻克房地产网站
  • 上不了国外网站 怎么做贸易网页浏览器设置在哪里
  • delphi可以做网站吗百色建设局网站
  • 网站建设及维护课件免费请人做装修设计上什么网站
  • 川沙网站建设淘客插件wordpress
  • 门户网站开发技术服务合同免费网页游戏源码
  • 网站批量查询工具做影视外包的网站
  • 营销型网站建设试题html5网站网址
  • 网站建设策划书(建设前的市场分析)环球资源网的定位
  • 上海企业都用什么网站网站公司建站
  • 华为云速建站可以做英文网站高端服装产品网站建设