仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 684|回复: 9
打印 上一主题 下一主题

[学习教程] 发布一篇Java多线程同步成绩的探求(五)

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:02:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
你精通任何一门语言就最强大。现在来看,java的市场比C#大,C#容易入手,比较简单,java比较难
5、你有我有全都有——ThreadLocal怎样办理并发平安性?
后面我们先容了Java傍边多个线程抢占一个共享资本的成绩。但不管是同步仍是重进锁,都不克不及实其实在的办理资本紧缺的情形,这些计划只是靠制订划定规矩来束缚线程的举动,让它们不再冒死的争抢,而不是真正从本色上办理他们对资本的需求。
在JDK1.2傍边,引进了java.lang.ThreadLocal。它为我们供应了一种全新的思绪来办理线程并发的成绩。可是他的名字不免让我们看文生义:当地线程?
甚么是当地线程?
当地线程开顽笑的说:不要沉沦哥,哥只是个传说。
实在ThreadLocal并不是ThreadatLocal,而是LocalVariableinaThread。
依据WikiPedia上的先容,ThreadLocal实际上是源于一项多线程手艺,叫做ThreadLocalStorage,即线程当地存储手艺。不单单是Java,在C++、C#、.NET、Python、Ruby、Perl等开辟平台上,该手艺都已得以完成。
当利用ThreadLocal保护变量时,它会为每一个利用该变量的线程供应自力的变量正本。也就是说,他从基本上办理的是资本数目的成绩,从而使得每一个线程持有绝对自力的资本。如许,当多个线程举行事情的时分,它们不必要纠结于同步的成绩,因而功能便年夜年夜提拔。但资本的扩大带来的是更多的空间损耗,ThreadLocal就是如许一种使用空间来调换工夫的办理计划。
说了这么多,来看看怎样准确利用ThreadLocal。
经由过程研讨JDK文档,我们晓得,ThreadLocal中有几个主要的办法:get()、set()、remove()、initailValue(),对应的寄义分离是:
前往此线程部分变量确当前列程正本中的值、将此线程部分变量确当前列程正本中的值设置为指定值、移除此线程部分变量以后线程的值、前往此线程部分变量确当前列程的“初始值”。
还记得我们在第三篇的上半节引出的谁人例子么?几个线程修正统一个Student对象中的age属性。为了包管这几个线程可以事情一般,我们必要对Student的对象举行同步。
上面我们对这个程序举行一点小小的改革,我们经由过程承继Thread来完成多线程:
/**
 *
 * @author x-spirit
 */
public class ThreadDemo3 extends Thread{
    private ThreadLocal<Student> stuLocal = new ThreadLocal<Student>();
    public ThreadDemo3(Student stu){
        stuLocal.set(stu);
    }
    public static void main(String[] args) {
        Student stu = new Student();
        ThreadDemo3 td31 = new ThreadDemo3(stu);
        ThreadDemo3 td32 = new ThreadDemo3(stu);
        ThreadDemo3 td33 = new ThreadDemo3(stu);
        td31.start();
        td32.start();
        td33.start();
    }
    @Override
    public void run() {
        accessStudent();
    }
    public void accessStudent() {
        String currentThreadName = Thread.currentThread().getName();
        System.out.println(currentThreadName + " is running!");
        Random random = new Random();
        int age = random.nextInt(100);
        System.out.println("thread " + currentThreadName + " set age to:" + age);
        Student student = stuLocal.get();
        student.setAge(age);
        System.out.println("thread " + currentThreadName + " first  read age is:" + student.getAge());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException ex) {
            ex.printStackTrace();
        }
        System.out.println("thread " + currentThreadName + " second read age is:" + student.getAge());
    }
}
<p>
到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。
老尸 该用户已被删除
沙发
发表于 2015-1-19 17:14:20 | 只看该作者
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
只想知道 该用户已被删除
板凳
发表于 2015-1-24 14:53:08 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
地板
发表于 2015-1-26 08:46:09 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
冷月葬花魂 该用户已被删除
5#
 楼主| 发表于 2015-2-2 11:31:11 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
深爱那片海 该用户已被删除
6#
发表于 2015-2-3 12:11:01 | 只看该作者
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
莫相离 该用户已被删除
7#
发表于 2015-2-26 10:50:10 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
再见西城 该用户已被删除
8#
发表于 2015-3-8 13:35:31 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
变相怪杰 该用户已被删除
9#
发表于 2015-3-16 00:15:35 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
不帅 该用户已被删除
10#
发表于 2015-3-22 18:09:30 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-24 00:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表