Java多线程编程三(volatile关键字)

  • 禁止编译器重排
  • 禁用寄存器,能够即使刷新内存数据更新

Java语言中的volatile变量可以被看作是一种程度较轻的synchronized;与synchronized块相比,volatile变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized的一部分。

Java volatile详解

内存可见性

可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。在单线程环境中,如果向某个变量先写入值,然后在没有其他写入操作的情况下读取这个变量,那么总能得到相同的值。这看起来很自然。然而,当读操作和写操作在不同的线程中执行时,情况却并非如此,这听起来或许有些难以接受。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。

Java引用类型

StrongReference 强引用

  • 回收时机:从不回收
  • 使用:对象的一般保存
  • 生命周期:JVM停止的时候才会终止

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
server {
listen 80;
server_name www.laravel.com;
index index.html index.htm index.php;
root /data/www/laravel/public;
server_name_in_redirect off;

location / {
try_files $uri $uri/ /index.php?$query_string;
}

location ~ .+\.php($|/)
{
#fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi.conf;

fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
client_max_body_size 20m; #客户端上传文件大小限制设为20M
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
#伪静态及日志
error_log /data/www/logs/laravel-error.log;
access_log /data/www/logs/laravel-access.log;
}

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :