冷月葬花魂 发表于 2015-1-18 11:02:58

发布一篇Java多线程同步成绩的探求(五)

你精通任何一门语言就最强大。现在来看,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

http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。

仓酷云 发表于 2015-1-26 08:46:09

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

冷月葬花魂 发表于 2015-2-2 11:31:11

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。

深爱那片海 发表于 2015-2-3 12:11:01

当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?

莫相离 发表于 2015-2-26 10:50:10

是一种将安全性(Security)列为第一优先考虑的语言

再见西城 发表于 2015-3-8 13:35:31

Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

变相怪杰 发表于 2015-3-16 00:15:35

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

不帅 发表于 2015-3-22 18:09:30

Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
页: [1]
查看完整版本: 发布一篇Java多线程同步成绩的探求(五)