⑴ 什么是java线程死锁,如何解决死锁问题
比如有两个线程执行,线程t1, 线程t2
t1 需要获取方法A的锁标志,同时方法A调用了方法B,t1获取了A的锁标志,并获取了B的锁标志,才能完成执行
同时t2也在执行,t2获取方法B的锁标志,方法B调用了方法A,t2也需要获取两个方法A,B的锁标志才能执行完成
当t1 获取了A方法的锁标志,同时t2获取了B方法的锁标志
那么t1会等待t2释放方法B的锁标志,t2也在等待t1释放方法A的锁标志,这样就形成了死锁,都在等待....
⑵ 关于JAVA里的加锁synchronized
1.凡使用synchronized标记的方法复,比如 public synchronized void func1() { .... },则制同时只有一个线程能够运行这个方法。比如,线程1正在运行func1,则其他线程需要运行func1的话,会卡住,等线程1运行func1结束后,其他线程中,才会有一个幸运儿成功争取到运行func1的资格,然后这个幸运儿线程开始运行func1。没有争取到运行资格的其他线程,会继续等待。
2.你的例子中,被锁定的是 方法 m1,而不是属性b。所以,m1的synchronized加锁操作,与b没有半点毛钱关系。
3.要实现你的锁b想法,其实很简单。去买一件贞操宝甲来就行了。开玩笑,哈哈。要锁b,把main方法里的tt.m2()修改为tt.m1()。
4.以后别用“b”作为变量,总觉得怪怪了。也许你现在还没长大,很单纯。但大人的世界里,“b”是一种不文雅但又对人类的未来有重要作用的东西。建议用cb来代替b。
⑶ java多线程死锁问题
public class Test520 {//测试类
public static void main(String[] args) {
Test1 t1=new Test1();//构造线程1
Test2 t2=new Test2();//构造线程2
t1.start();//启动线程1
t2.start();//启动线程2
}
}
class Test1 extends Thread{//线程类1
public void run() {//线程类1的run方法
synchronized (A.class) {//线程类1获取A类的锁
new A().a();//构建A类调用a方法,线程可以执行到这里
synchronized (B.class) {//线程1请求获取B类的锁,看后面的代码我们知道B类的锁在线程2中,形成死锁
new B().b();//构造B类,调用b方法,这语句无法执行,因线程1始终无法获得已被线程2获得的B类锁
}
}
}
}
class Test2 extends Thread{//线程类2
public void run() {//线程类2的run方法
synchronized (B.class) {//线程2获取了B类的锁,因此线程1无法在调用a方法后获取B类锁执行后面的语句
new A().a();//构造A类对象调用a方法,此语句可以执行
synchronized (A.class) {//线程2请求A类锁,A类锁此时被线程1持有
new B().b();//如果线程2能够获取A类锁,就能执行这一步,测试知道,无法执行到这句
}
}
}
}
class A{//测试类
public void a() {
System.out.println("a");
}
}
class B{//测试类
public void b() {
System.out.println("b");
}
}
⑷ Java项目中如何实现数据的安全性,比如安全锁之类的,求代码
您好,提问者:
1、重要信息进行加密操作。
2、地址栏尽量采用post提交方式。
3、如果涉及多线内程的话,可以使用Synchronized锁。容
下面例子:
publicclassMain{
publicstaticvoidmain(String[]args){
newThread(newSuo()).start();
newThread(newSuo()).start();
//开启两个线程,加锁之后数据就不会出错
}
}
classSuoimplementsRunnable{
privatestaticintnum=100;
publicsynchronizedvoidrun(){
while(true){
if(num==0)
break;
else
System.out.println(num--);
}
}
}
⑸ java多线程中,如何给静态变量(如List)加锁/同步
使用synchronized关键字同步方法就可以了。
public class Foo2 {
private int x = 100;
public int getX() {
return x;
}
//同步方法
public synchronized int fix(int y) {
x = x - y;
System.out.println("线程"+Thread.currentThread().getName() + "运行结束,减少“" + y + "”,当前值为:" + x);
return x;
}
}
⑹ 求解java多线程的死锁
你这是同步锁,锁的是A对象。有线程跟你一样用 A对象当锁的时候 ,只会有一条线程 来执行 B。其他线程都得等待。
1.A区域究竟什么对象可以作为锁?
对象,类对象。类对象 全局只有一个 比如 A.class ,当有人用到 这个类对象的时候 就会将其锁住。不让其他线程进入。
2.是不是我在一个线程中将A这个对象作为锁,在另一个线程中对A这个对象进行操作,就会发生死锁?
死锁的根本原因1)是多个线程涉及到多个锁,这些锁存在着交叉,所以可能会导致了一个锁依赖的闭环;2)默认的锁申请操作是阻塞的。所以要避免死锁,就要在一遇到多个对象锁交叉的情况,就要仔细审查这几个对象的类中的所有方法,是否存在着导致锁依赖的环路的可能性。要采取各种方法来杜绝这种可能性。
你这样 锁不到的。举个例子 死锁 就是 x线程 锁住了 A对象 然后 调用B对象的方法,y线程 锁住了B对象调用A对象的方法,两边 都在互相尝试获取对方的锁,但是拿不到。因为 x锁住了A对象。y锁住了B对象。他们互相拿不到 就叫死锁。这只是个例子还有很多。
3不是说任何对象都可以作为一把锁吗?那么每一个锁我使用一个独立的成员对象作为锁,不就是可以很容易避开死锁吗?为什么说死锁很容易发生?
你每个锁用一个独立的成员对象作为锁,没问题,只要没有存在交叉。上面那个例子一样。
避免死锁是一件困难的事,遵循以下原则有助于规避死锁:
1、只在必要的最短时间内持有锁,考虑使用同步语句块代替整个同步方法;
2、尽量编写不在同一时刻需要持有多个锁的代码,如果不可避免,则确保线程持有第二个锁的时间尽量短暂;
3、创建和使用一个大锁来代替若干小锁,并把这个锁用于互斥,而不是用作单个对象的对象级别锁;