java 汇总_java基础汇总

1.关于Http和Hibernatet里面Session的区别

HttpSession

HttpSession:是一个抽象接口,J2EE的Web程序在运行的时候,会给每一个新的访问者建立一个HttpSession,这个Session是用户身份的唯一标示,WEB 会话跟踪用的。【注:是容器(Tomca)自动创建的】

HttpSession用途:存放用户的一些经常被用到的信息,如:用户名,权限。

HttpSession获取方法:HttpSession session = request.getSession();

Hibernate Session

Hibernate Session是把JDBC的Connection和Transaction接口进行了简单的封装后的一个接口,即此Session主要用来管理对象的增、删、改、查和事务的,还有只要持久化类的实例对象与Session关联了,那此对象就不只是简单的在内存中了,而是可以通过Session对象去管理它了,所以也称此对象在Session缓存中即Hibernate所提到的一级缓存。

2.使用Boolean类型同步锁引起异常的分析

public class MyTest {

public static void main(String[] args) throws Exception {

new TestThread().start();

new TestThread().start();

Thread.sleep(1000);

System.out.println("Doing something...");

synchronized (lock) {

lock = false; // 语句1

lock.notifyAll(); // 语句2

}

}

static volatile Boolean lock = true;

}

class TestThread extends Thread {

@Override

public void run() {

synchronized (MyTest.lock) {

while (MyTest.lock) {

try {

MyTest.lock.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(getId());

}

}

}

输出结果为

Doing something...

Exception in thread

"

main

"

java.lang.IllegalMonitorStateException

at java.lang.Object.notifyAll(Native Method)

at MyTest.test(MyTest.java:

13

)

at MyTest.main(MyTest.java:

3

如果

把语句1和语句2调换一下就正常了。 大家给诊断一下,到底是为什么?

讨论过程请大家自行参考原始的帖子和我的整理帖子,这里只给出最终的分析结果

分析:

当作为同步锁的对象发生改变时,比如换了一个新的对象,那么如果在新的对象上调用同步的wait等方法,由于并没有同步这个对象,而是同步的改变以前的那个,就会报出如上的异常。 我们来看代码

synchronized (lock) {

lock = false; // 语句1

lock.notifyAll(); // 语句2

}

语句1那里修改了lock的对象指向,结果造成下面的一句notifyAll使用了一个并没有synchronized的对象,随意报出了异常。

解决方法

方案1,使用Boolean的特殊性 由于 lock=false;的特殊性,分析Boolean的源代码发现

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);

public static Boolean valueOf(boolean b) {

return (b ? TRUE : FALSE);

}

//发现其内部对于自动打包,拆包只使用了2个固定的对象。所以可以用

synchronized (lock) {

lock = false; // 语句1

Boolean.TRUE.notifyAll(); // 语句2

}

// 直接使用那个TRUE就行了。

方法2:使用一个参数可变对象,而不是不可变的,

比如

class MyLock {

boolean lock = true;

}

static volatile MyLock lock = new MyLock();

// 然后再代码里面用

lock.lock=false;// 进行标志的变更和判断就可以了

结论:

同步锁最好单独使用,如果锁自身附带了其它作用,应使用一个可变的对象 推荐

static volatile MyLock lock = new MyLock();

应该写成:

final static volatile MyLock lock = new MyLock();

注意:volatile修饰符

0818b9ca8b590ca3270a3433284dd417.pngVolatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

0818b9ca8b590ca3270a3433284dd417.png使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。 由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

3.死锁和活锁

一、活锁

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求,...,T2有可能永远等待,这就是活锁的情形,如图8.4(a)所示。

避免活锁的简单方法是采用先来先服务的策略。

二、死锁 如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564234.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C 天数的计算

根据程序提示输入某年某月某日&#xff0c;判断这一天是这一年的第几天&#xff0c;并进行输出显示。 效果演示 完整代码 #include <stdio.h> int main() {int day,month,year,sum,leap;printf("\n请输入年、月、日&#xff0c;格式为&#xff1a;年,月,日&#…

java+filter加密_Javaweb之Filter案例练习-自动登录问题和MD5加密

自动登录问题和MD5加密前面已经完成了Filter的自动登录&#xff0c;但是有问题&#xff0c;我们在web.xml中Filter的url-mapping中配置的规则是/*, 也就是这个网站的所有请求都拦截。这肯定不合适。我们本来访问/login.jsp&#xff0c;本来就是去登录&#xff0c;结果也进行了拦…

C 从小到大排序

将数字按从小到大的的顺序进行排序输出&#xff0c;根据提示输入相应的数字个数&#xff0c;每输入一个数字要进行换行然后输入下一个数字&#xff0c;当三个数字完全输入之后点击回车&#xff0c;程序会根据从大到小的顺序进行数字的排序输出。 效果演示 完整代码 #include…

java class文件常量池_JAVA程序员谈谈class文件结构中的常量池-class文件

常量的类型有12种CONSTANT_Utf8_info1字面量UTF-8编码的字符串CONSTANT_Integer_info3字面量整型字面量CONSTANT_Float_info4字面量浮点型字面量CONSTANT_Long_info5字面量长整型字面量CONSTANT_Double_info6字面量双精度浮点型字面量CONSTANT_Class_info7符号引用类或接口的符…

C 输出图案

在C语言中使用 * 号输出各种图案。 用 * 输出字母C 效果 完整代码 #include <stdio.h>int main() {printf("用 * 号输出字母 C\n");printf(" ****\n");printf("*\n");printf("*\n");printf(" ****\n");} 用 * 输出…

C 多数排序

使用C语言编写程序对多个数字进行排序输出的操作。 根据提示输入十个数字并按照从小到大的顺序进行输出显示。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int i,j,a[N],temp;printf("请输入 10 个数字&#xff1a;\n");for(i0;i<N;i)s…

java httppost wsdl_Java使用HttpUrlConnection调用webService(wsdl)

首先需要下载工具https://pan.baidu.com/s/1XQ-VubxcPFoqwGm7wierHg下载成功后解压打开exe程序&#xff0c;在wsdl endpoint中输入你wsdl的地址&#xff0c;点击get&#xff0c;等待一小会后会跳到invoke标签下的界面点击某个方法&#xff0c;例如上图的login&#xff0c;可以看…

php判断一个字符串是否为纯数字,php判断变量是否为纯数字字符串的方法

在php中有时候需要判断一个变量的值是否为数字或是否为数字字符串&#xff0c;而php中也提供了一个很好用的内置函数 is_numeric()&#xff0c;可以很轻松的来检测变量。php is_numeric() 函数介绍is_numeric()&#xff1a;检测一个php的变量是否为数字或数字字符串。语法&…

C 反向输出

使用C语言的递归方法对输入的字符进行反向输出。 效果 完整代码 #include <stdio.h>int main() {int i5;void palin(int n);printf("请输入5个字符\40:\40");palin(i);printf("\n"); } void palin(n) int n; {char next;if(n<1) {nextgetchar(…

C 数组逆序输出

编写程序对固定内容的数组进行逆序输出&#xff0c;第一个值和最后一个值的位置互换。 效果 完整代码 #include<stdio.h> #define N 10 int main() {int a[N]{10,100,20,43,54,15,6,77,82,91};int i,t;printf("原始数组是:\n");for(i0;i<N;i)printf(&quo…

php修改http header,php header函数的常用http头设置

//okheader(‘HTTP/1.1 200 OK);//设置一个404头:header(‘HTTP/1.1 404 Not Found);//设置地址被永久的重定向header(‘HTTP/1.1 301 Moved Permanently);//转到一个新地址header(‘Location: http://www.example.org/‘);//文件延迟转向:header(‘Refresh: 10; urlhttp://www…

C 论大小

比较两个数字的大小并进行判断输出。 效果 完整代码 #define LAG > #define SMA < #define EQ #include <stdio.h> int main() {int i,j;printf("请输入两个数字&#xff1a;\n");scanf("%d %d",&i,&j);if(i LAG j)printf("%…

php读这文件速度,php 测试硬盘读写-php 测试硬盘写速率

使用php写入一个1GB大小的文件&#xff0c;检查硬盘的写速率&#xff0c;可能有一定误差&#xff0c;建议还是使用专业的硬盘测试工具来检测一般电脑读写在20M/s&#xff0c;这个测试要执行大概40-50s仅供参考&#xff1a;set_time_limit(0);$str str_pad($str, 512, "0&…

php替换算法,PHP实现各种经典算法 || 我们的爱的博客

以下是代码片段&#xff1a;//--------------------// 基本数据结构算法//--------------------//二分查找(数组里查找某个元素)function bin_sch($array, $low, $high, $k){if ( $low < $high){$mid intval(($low$high)/2 );if ($array[$mid] $k){return $mid;}elseif…

C++ 运算符重载规则

运算符重载是通过函数重载实现的&#xff0c;下面我们来介绍一下运算符重载需要遵循的规则。 1 并不是所有的运算符都可以重载。能够重载的运算符包括&#xff1a; - * / % ^ & | ~ ! < > - * / % ^ & | << >> << &…

C++ 重载数学运算符

四则运算符&#xff08;、-、、/、、-、、/&#xff09;和关系运算符&#xff08;>、<、<、>、、!&#xff09;都是数学运算符&#xff0c;它们在实际开发中非常常见&#xff0c;被重载的几率也很高&#xff0c;并且有着相似的重载格式。 复数能够进行完整的四则运…

php 隐藏 div 代码,在HTML里用CSS隐藏div的方法

我们知道&#xff0c;在制作网页的过程中常常会想隐藏一些内容&#xff0c;比如网站添加第三方统计显示的图标等&#xff0c;如何通过CSS隐藏&#xff0c;怎么让图片作为背景&#xff0c;但文字又不显示呢&#xff1f;这篇文章来给大家解读一下。一、普通隐藏网页内容CSS样式单…

php+错误+处理,PHP 错误处理手记!!!!!

header("content-type:text/html;charsetutf-8");/**定义errror_handler函数作为set_error_handler()的第一个参数回调;param int $error_level 错误级别param string $error_message 错误信息param string $file 错误所在文件param int $line 错误所在行*/function …

网络第3天

基于UDP的TFTP文件传输 功能&#xff1a;下载、上传、退出 #include <myhead.h> #define IP "192.168.8.100" #define PORT 69 int download_file(int…

C++ 重载左移和右移运算符

C中&#xff0c;标准库本身已经对左移运算符<<和右移运算符>>分别进行了重载&#xff0c;使其能够用于不同数据的输入输出&#xff0c;但是输入输出的对象只能是 C 内置的数据类型&#xff08;例如 bool、int、double 等&#xff09;和标准库所包含的类类型&#x…